Другой вариант - использовать стандартный инструмент Unix join
:
join -t- -1 1 -2 2 -v 1 <(sort file1) <(sort -t- -k 2 file2)
Команда объединяет две таблицы в некотором поле соединения. Это требует, чтобы два файла были отсортированы по полю соединения, поэтому нам нужны две команды сортировки. Мы также могли бы сделать это немного более читабельным, используя временные файлы:
sort file1 > file1.sorted
sort -t- -k 2 file2 > file2.sorted
join -t- -1 1 -2 2 -v 1 file1.sorted file2.sorted
Первая команда sort
просто сортирует строки файла. Вторая команда сортировки сортируется по второму полю (-k 2
), используя тире в качестве разделителя полей (-t-
).
Команда join
также указывает -
в качестве разделителя полей (-t-
) и выбирает первый столбец в первом файле в качестве ключа объединения (-1 1
), а второй столбец во втором файле ( -2 2
). Вывод ограничен неперемещаемыми строками из первого файла (-v 1
).
Если ваши файлы действительно большие, это решение более эффективно, чем любое другое, но в большинстве практических случаев разница в производительности не должна иметь большого значения.