awk – 比较两个文件中的2个文件和打印列

我刚才发布了类似的东西,我想,提供的代码可以帮助解决我的问题,但不幸的是我无法根据我的需要调整它: awk – 比较两个文件中的文件和打印行

所以,我又有两个以制表符分隔的文件。

file_1.txt

apple 2.5 5 7.2 great 3.8 10 3.6 see 7.6 3 4.9 tree 5.4 11 5 back 8.9 2 2.1 

file_2.txt

 apple :::N back :::ADJ back :::N around :::ADV great :::ADJ bee :::N see :::V tree :::N 

输出应如下所示:

 apple :::N 2.5 5 7.2 great :::ADJ 3.8 10 3.6 back :::ADJ 8.9 2 2.1 back :::N 8.9 2 2.1 see :::V 7.6 3 4.9 tree :::N 5.4 11 5 

与另一篇文章的不同之处在于,我只想比较file_1.txt和file_2.txt的第一列,然后将file_1.txt的整行与file_1.txt的第2列一起打印到outfile。 我不在乎将$ 2的file_2.txt打印到outfile中,因此outfile也可以看起来像

 back 8.9 2 2.1 :::N back 8.9 2 2.1 :::V etc. 

问题是这里的column1中的重复项。 否则我当然可以使用paste 。 这个`awk-command的问题是,它不读取数组中的column2,如果我告诉它打印它,当然这是不可能的。

 awk 'NR==FNR {a[$1]; next} $1 in a {print $0, a[$2]}' OFS='\t' file_2.txt file_1.txt > outfile.txt 

我很高兴感谢任何帮助! 对不起这里的愚蠢,似乎我完全难倒。

如果你有GNU awk (可以从存储库中通过包gawk ),它支持多维数组,你可以这样做

 gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt 

防爆。

 $ gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt apple 2.5 5 7.2 :::N great 3.8 10 3.6 :::ADJ see 7.6 3 4.9 :::V tree 5.4 11 5 :::N back 8.9 2 2.1 :::ADJ back 8.9 2 2.1 :::N 

否则,如果输出顺序不重要,最简单的解决方案可能是使用join命令:

 $ join -t $'\t' <(sort file_1.txt) <(sort file_2.txt) apple 2.5 5 7.2 :::N back 8.9 2 2.1 :::ADJ back 8.9 2 2.1 :::N great 3.8 10 3.6 :::ADJ see 7.6 3 4.9 :::V tree 5.4 11 5 :::N