awk
Обработка двух файлов
Поиск…
Проверка совпадающих полей в двух файлах
Учитывая эти два файла CSV:
$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6
Чтобы напечатать эти строки в file2 , второй столбец которого встречается также в первом файле, мы можем сказать:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4
Здесь lines[] содержат массив, который заполняется при чтении file1 содержимым второго поля каждой строки.
Затем условие $2 in lines проверяет для каждой строки в file2 , если в массиве существует 2-е поле. Если это так, условие равно True, а awk выполняет свое действие по умолчанию, состоящее в печати полной строки.
Если требуется только одно поле для печати, это может быть выражением:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2
Печать переменных awk при чтении двух файлов
Надеюсь, что этот пример поможет каждому понять, как изменяются внутренние переменные awk, такие как NR, FNR и т. Д., Когда awk обрабатывает два файла.
awk '{print "NR:",NR,"FNR:",FNR,"fname:",FILENAME,"Field1:",$1}' file1 file2
NR: 1 FNR: 1 fname: file1 Field1: f1d1
NR: 2 FNR: 2 fname: file1 Field1: f1d5
NR: 3 FNR: 3 fname: file1 Field1: f1d9
NR: 4 FNR: 1 fname: file2 Field1: f2d1
NR: 5 FNR: 2 fname: file2 Field1: f2d5
NR: 6 FNR: 3 fname: file2 Field1: f2d9
Где file1 и file2 выглядят следующим образом:
$ cat file1
f1d1 f1d2 f1d3 f1d4
$ cat file2
f2d1 f2d2 f2d3 f2d4
Обратите внимание, что значение NR продолжает увеличиваться среди всех файлов, тогда как FNR сбрасывается на каждый файл. Вот почему выражение NR==FNR всегда относится к первому файлу, поданному в awk, поскольку только в первом файле возможно иметь NR равный FNR .