почему awk должен соответствовать двум полям в двух файлах? - PullRequest
0 голосов
/ 12 июня 2018

У меня есть два файла TEST t.xyz и a.xyz, каждый из которых содержит три столбца.У a.xyz больше строк, чем у t.xyz.Я хотел бы вывести строки, в которых $ 1 и $ 2 t.xyz совпадают с $ 1 и $ 2 a.xyz.Общее количество выходных строк должно быть таким же, как у t.xyz.Работает нормально, но когда я применяю его к большому файлу, вывод получается больше, чем в t.xyz.Буду признателен за любую помощь, чтобы исправить это.

Я использую следующее:

awk 'FNR==NR{a[$1];b[$2];next} $1 in a && $2 in b'  t.xyz a.xyz > out.xyz
t.xyz
1907.05604682 2983.53399456 -5435.67749023
1908.05607621 2983.53399456 -3593.08154297
1910.05613499 2983.53399456 -1238.71289063
1911.05616438 2983.53399456 -4244.93823242
1912.05619377 2983.53399456 -3595.24414063
1913.05622316 2983.53399456 -2454.96728516
1923.05651706 2983.53399456 NaN

a.xyz
1907.05604682 2983.53399456 35.67749023
1908.05607621 2983.53399456 93.08154297
1910.05613499 2983.53399456 38.71289063
1911.05616438 2983.53399456 44.93823242
1912.05619377 2983.53399456 95.24414063
1913.05622316 2983.53399456 54.96728516
1923.05651706 2983.53399456 NaN
631.018545121 2646.58662319 24.715881348
635.018662681 2646.58662319 27.13696289

expected out.xyz
1907.05604682 2983.53399456 35.67749023
1908.05607621 2983.53399456 93.08154297
1910.05613499 2983.53399456 38.71289063
1911.05616438 2983.53399456 44.93823242
1912.05619377 2983.53399456 95.24414063
1913.05622316 2983.53399456 54.96728516
1923.05651706 2983.53399456 NaN

1 Ответ

0 голосов
/ 12 июня 2018
$ awk 'NR==FNR{a[$1,$2]; next} ($1,$2) in a' file1 file2

1907.05604682 2983.53399456 35.67749023
1908.05607621 2983.53399456 93.08154297
1910.05613499 2983.53399456 38.71289063
1911.05616438 2983.53399456 44.93823242
1912.05619377 2983.53399456 95.24414063
1913.05622316 2983.53399456 54.96728516
1923.05651706 2983.53399456 NaN

однако, если нет ограничений уникальности для значений file2, любая соответствующая запись будет напечатана.Если вы хотите напечатать первую подходящую запись только для

$ awk 'NR==FNR{a[$1,$2]; next} ($1,$2) in a{print; delete a[$1,$2]}' file1 file2

, вы можете также распечатать их все, но указать, что есть дубликаты

$ awk 'NR==FNR      {a[$1,$2]; next} 
       ($1,$2) in a {c=a[$1,$2]++; print $0, (c>1)?c:"" }' file1 file2

, это можно сделать после выводафайл также сгенерирован.

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