我之前发布了一些类似的内容,我认为提供的代码可以帮助解决我的问题,但不幸的是我无法根据我的需要进行调整: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