为什么awk匹配两个文件中的两个字段失败?

时间:2018-06-12 16:31:14

标签: awk

我有两个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 :(得分:2)

$ 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

这也可以在生成输出文件后完成。