awk-比较两个文件并打印两个文件中的列

awk-比较两个文件并打印两个文件中的列

我之前发布了一些类似的内容,我认为提供的代码可以帮助解决我的问题,但不幸的是我无法根据我的需要进行调整:awk-比较文件并打印两个文件中的行

因此,我又有了 2 个制表符分隔的文件。

文件_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

文件_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 列打印到输出文件。我不关心 file_2.txt 的 $2 以何种顺序打印到输出文件,因此输出文件也可以看起来像

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

问题在于列 1 中的重复项,如这里所示。否则我当然可以使用paste。这个 `awk 命令的问题是,它不会读取数组中的列 2,如果我告诉它打印它,这当然是不可能的。

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

我很高兴能得到任何帮助!抱歉,我在这里也犯了愚蠢的错误,看来我完全被难住了。

答案1

如果你有支持多维数组的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

相关内容