Команда awk для сравнения двух файлов
Хотелось бы разобраться в следующей конструкции:
awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' 1.txt 2.txt
Вот то, что я, надеюсь, правильно понял:
{a[$1];}
это заполнение массива a первыми словами каждой строки из файла 1.txt
!($1 in a){print $1}
печатать первые слова каждой строки файла 2.txt в 3.txt, если НЕ найдем их в массиве a
Но что в NR==FNR{a[$1];next} именно значит NR==FNR и next?
Буду благодарен за объяснение.
Ответы (1 шт):
Автор решения: Pak Uula
→ Ссылка
В скрипте NR==FNR{a[$1];next}!($1 in a){print $1} два правила:
NR==FNR{a[$1];next}- это правило выполняется для всех строк, для которых номер строки в файле (переменнаяFNR) совпадает с номером строки во всех файлах (переменнаяNR). Фактически, это условие означает "строка из первого файла". Переменная$1- это первое слово в строке.a[$1]создаёт в массивеaзапись с ключом$1.nextозначает, что нужно остановить обработку текущей строки и перейти к следующей. То есть второе правило не будет применяться для строк из первого файла. Первое правило создаёт множество слов, с которых начинаются строки в первом файле.!($1 in a){print $1}- это правило выполняется при условии!($1 in a), то есть для тех строк, в которых первое слово не встречается среди ключей массиваa. Действие этого правила печатает первое слово соответствующих строк.
Итого, данный скрипт печатает начальные слова строк из второго-третьего-последующих файлов, с которых не начинались строки из первого файла.