Это считывает все строки в a.txt и отслеживает все значения столбца 2. Затем он читает b.txt и печатает любые повторяющиеся значения столбца 2:
$ awk 'NR==FNR {seen[$2]=1; next} seen[$2]==1 {seen[$2]++; print $2}' a.txt b.txt
abcd
2dfg
Команда awk может быть разделена на две части. Первая часть:
NR==FNR {seen[$2]=1; next}
awk сначала проверяет, совпадает ли общее количество обработанных записей (строк), NR, с количеством записей, обрабатываемых в этом файле, . Это верно только для первого обработанного файла, который в этом случае является a.txt. Таким образом, для каждой строки из a.txt ассоциативный массив seen с ключом, установленным на значение второго столбца, $2, устанавливается в значение 1. Это будет использоваться для указания того, что это значение столбца-2 было «видно» в a.txt. Следующая команда: next, которая сообщает awk пропустить остальные команды и перейти к следующей записи.
Вторая часть:
seen[$2]==1 {seen[$2]++; print $2}
Из-за next в первой части выше, эта часть выполняется только файлом b.txt. Эта часть начинается с теста: он проверяет, было ли значение столбца-2, $2 для этой записи ранее. Если раньше было замечено, то выполняются команды в фигурных скобках. Первая команда в фигурных скобках seen[$2]++ увеличивает значение seen, так что мы больше не будем обрабатывать это значение столбца-2. (Следовательно, повторяющиеся значения столбца-2 игнорируются.) Вторая команда просто печатает значение столбца-2, которое было замечено ранее в a.txt.
Если мы можем верить, что повторений нет значения для столбца 2, возможен более простой сценарий:
$ awk '{print $2}' a.txt b.txt | sort | uniq -d
2dfg
abcd