awk 'FNR==NR{a[$1]++;next}!a[$1]' file1 file2
Как это работает:
FNR==NR
Если у вас есть два (или более) входных файла для awk, NR
вернется к 1 в первой строке следующего файла, тогда как FNR
продолжит увеличиваться с того места, где оно было остановлено. Проверяя FNR==NR
, мы в основном проверяем, анализируем ли мы в настоящее время первый файл.
a[$1]++
Если мы будем анализировать первый файл (см. Выше), то создадим ассоциативный массив с первым полем $1
в качестве ключа и затем увеличим значение на 1. Это, по сути, позволяет нам создать ' увиденный список.
next
Эта команда говорит awk не обрабатывать дальнейшие команды, читать следующую запись и начинать заново. Мы делаем это, потому что file1 предназначен только для установки ассоциативного массива
!a[$1]
Эта строка выполняется только тогда, когда FNR==NR
имеет значение false, то есть мы не анализируем файл1 и, следовательно, должны анализировать файл2. Затем мы используем первое поле $1
файла file2 в качестве ключа для индексации в нашем «видимом» списке, созданном ранее. Если возвращаемое значение равно 0, это означает, что мы не видели его в file1, и поэтому мы должны напечатать эту строку. И наоборот, если значение не равно нулю, мы видели в файле1 и, следовательно, не выводим его значение. Обратите внимание, что !a[$1]
эквивалентно !a[$1]{print}
, потому что действие по умолчанию, если оно не задано, - это печать всей строки.