Bash:在另一个文件中查找文件的模式,并打印出后者维护订单的相应字段

时间:2015-10-28 11:16:32

标签: bash awk grep pattern-matching multiple-files

卡里西米,

我已经尝试了一段时间来解决这个问题,我检查了很多帖子(例如grep, awk or sed? Print lines in one file matching patterns in another file或此处awk search for a field in another file)而没有真正找到我要找的内容。我需要使用bash工具的解决方案,如sed,grep,awk(没有python,R,...)

我有两个文件(比那些文件大得多):

文件1:

   2   891299  0.50923964E-02     1248   4.713       1349.08
   3   245857  0.57915542E-02     1335   4.671       1369.65

file2的:

   278    2645  2334659  0.75142      0.53123
   279    2643   245857  0.80439      0.56868
   500    1341   830677  0.74922      0.52958
   501    1339   882791  0.87685      0.61980
   502    1337   891299  0.63224      0.44680

在这个例子中,我想找到file2第3列中file1的第2列中的模式,然后打印后者的第1列,对于file1的所有行并保持file1给出的顺序。

一个可能的解决方案(我知道不是没有bug)是以下令人无法接受的慢速bash循环:

for i in `awk '{print $2}' file1` ; do grep " $i " file2 | awk '{print $1}' ; done

打印到屏幕:

502

279

请注意,简单的'解决方案如:

awk 'NR==FNR{pats[$2]; next} $3 in pats' file1 file2

是不合适的,因为打印的顺序是由file2而不是file1给出的(即它首先打印到屏幕然后再打印到502)。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您可以在awk中反转要处理的文件并获得正确的输出:

awk 'NR==FNR{pats[$3]=$1; next} $2 in pats{print pats[$2]}' file2 file1
502
279