Предположим, у вас есть файл data.txt со следующим содержимым:
apple
banana
cherry
date
fig
grape
orange
И предположим, что вы хотите сравнить этот файл с другим файлом filter.txt, который содержит:
banana
date
grape
kiwi
В этом случае вы хотите получить:
- Выше — записи из первого файла, которых нет во втором.
- Ниже — записи из второго файла, которых нет в первом.
Можно использовать следующую команду awk для достижения этой цели:
awk 'FNR==NR { filter[$1]; next } !($1 in filter) { print $1, "" } END { for (item in filter) if (!(item in seen)) print "", item }' filter.txt data.txt
Как это работает
- FNR==NR { filter[$1]; next }: Это условие обрабатывает первый файл filter.txt. Оно создает ассоциативный массив filter, в котором ключами являются записи из первого столбца. next пропускает оставшуюся часть скрипта для текущей строки.
- !($1 in filter) { print $1, "" }: Эта часть обрабатывает второй файл data.txt. Она проверяет, находится ли текущее значение в массиве filter. Если нет, то строка выводится слева с пустым значением справа.
- В блоке END происходит второй проход по массиву filter, где проверяется, нет ли значений из второго файла в первом файле. Если значение отсутствует, оно печатается справа.
Если вы запустите указанную команду с приведенными выше файлами, вы получите следующий результат:
apple
cherry
orange
kiwi
Это значит, что apple, cherry, и orange отсутствуют во втором файле, а kiwi отсутствует в первом файле. Вы можете адаптировать эту команду для работы с вашими файлами и данными.