卡里西米,
我已经尝试了一段时间来解决这个问题,我检查了很多帖子(例如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)。
非常感谢你的帮助。
马
答案 0 :(得分:2)
您可以在awk中反转要处理的文件并获得正确的输出:
awk 'NR==FNR{pats[$3]=$1; next} $2 in pats{print pats[$2]}' file2 file1
502
279