Как распечатать определенные выходные данные в команде awk - PullRequest
1 голос
/ 26 мая 2020

файл1

area@wide.com
geo@earth.com
sun@far.com

файл2

area@wide.com:200
moon@mars.com:100
venus@distance.com:0
geo@earth.com:201
sun@far.com:10

файл3 должно выглядеть так:

area@wide.com:200
geo@earth.com:201
sun@far.com:10

Пробовал:

awk -F, 'BEGIN{OFS=":"} NR==FNR{a[$1$2]=$3;next}'

1 Ответ

2 голосов
/ 26 мая 2020
awk -F: 'NR==FNR{a[$0]; next} $1 in a' file1 file2
  • -F: установить : как разделитель полей
  • NR==FNR{a[$0]; next} создать ключи массива на основе полного содержимого строки file1
  • $1 in a print строка из file2, если первое поле является ключом в массиве a


Похоже, ваши файлы могут иметь окончание строки в стиле dos, и в этом случае вы можете использовать:

awk -F: 'NR==FNR{sub(/\r$/, ""); a[$0]; next} $1 in a' file1 file2

Здесь возврат каретки в конце строк в file1 удаляется перед использованием его в качестве ключа, поэтому он будет соответствовать первому полю file2. Кроме того, вывод будет в стиле dos.

См. Также Почему вывод моего инструмента перезаписывается и как это исправить?


Если есть пробелы такие символы, как пробел, табуляция и т. д. c в конце строки, что также может вызвать проблему. В таком случае используйте

awk -F: 'NR==FNR{sub(/[[:space:]]*$/, ""); a[$0]; next} $1 in a' file1 file2

. Это удалит лишние пробелы в конце строки, прежде чем использовать ее в качестве ключа. Это также будет работать для файлов в стиле dos.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...