Я изучаю сравнение файлов, используя awk
.
Я нашел синтаксис, как показано ниже,
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
Я не мог понять, какое NR==FNR
в этом значение? Если я попробую, FNR==NR
то получу такой же результат?
Что именно он делает?
a==b
иb==a
получили такой же результат?Two-file Processing
На backreference.org/2010/02/10/idiomatic-awkОтветы:
В awk
FNR
относится к номеру записи (обычно номеру строки) в текущем файле иNR
относится к общему номеру записи. Оператор==
- это оператор сравнения, который возвращает истину, если два окружающих операнда равны.Это означает, что условие
NR==FNR
истинно только для первого файла, так какFNR
сбрасывается обратно на 1 для первой строки каждого файла, ноNR
продолжает увеличиваться.Этот шаблон обычно используется для выполнения действий только с первым файлом.
next
Внутри блока означает любые дополнительные команды пропускаются, поэтому они работают только на других , чем первые файлы.Условие
FNR==NR
сравнивает те же два операнда, что иNR==FNR
, поэтому оно ведет себя одинаково.источник
a='3x'; if [[ $a == 3* ]]; then echo yes; fi
и вы не можете переключаться с обеих сторон==
.Ищите ключи (первое слово строки) в файле2, которые также находятся в файле1.
Шаг 1: заполните массив a первыми словами файла 1:
Шаг 2: Заполните массив a и проигнорируйте файл 2 в той же команде. Для этого проверьте общее количество записей до этого момента с номером текущего входного файла.
Шаг 3. Игнорируйте действия, которые могут произойти после
}
анализа файла 1.Шаг 4: распечатайте ключ файла2, если он найден в массиве a
источник
;next
это странное дополнение (например, добавлениеnext
точки с запятой на шаге 3). Вы можете протестировать шаг 1 с помощьюawk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1
.Посмотрите
NR
иFNR
в руководстве по AWK , а затем спросите себя , что это условие , при которомNR==FNR
в следующем примере:источник
ARGIND
, иначе вы можете это сделатьFNR==1{ print ++file_nr }
.Есть
awk
встроенные переменные.NR
- Дает общее количество обработанных записей.FNR
- Дает общее количество записей для каждого входного файла.источник
Предполагая, что у вас есть файлы a.txt и b.txt с
Имейте в виду, что NR и FNR - это встроенные переменные awk. NR - Общее количество обработанных записей. (в данном случае как в a.txt, так и в b.txt) FNR - дает общее количество записей для каждого входного файла (записи в a.txt или b.txt)
позволяет добавить «следующий», чтобы пропустить первое совпадение с NR == FNR
в b.txt и в a.txt
в b.txt, но не в a.txt
источник