我想使用 awk 根据匹配列合并两个文件
b.txt(制表符分隔)
A
B
C
D
C
C
E
G
a.txt(制表符分隔)
1 2 2 4 19 A
2 2 3 3 12 B
3 2 9 2 5 C
4 3 8 0 9 D
5 5 4 1 1 E
然后我运行脚本
awk -F"\t" 'BEGIN{OFS="\t"} {if (NR==FNR) {a[$NF]=$0; next} if ($NF in a) {print a[$1]}}' a.txt b.txt > c.txt
我得到这样的 c.txt
1 2 2 4 19 A
2 2 3 3 12 B
3 2 9 2 5 C
4 3 8 0 9 D
3 2 9 2 5 C
3 2 9 2 5 C
5 5 4 1 1 E
实际上,我想要的输出是
1 2 2 4 19 A
2 2 3 3 12 B
3 2 9 2 5 C
4 3 8 0 9 D
3 2 9 2 5 C
3 2 9 2 5 C
5 5 4 1 1 E
G
或者
A 1 2 2 4 19
B 2 2 3 3 12
C 3 2 9 2 5
D 4 3 8 0 9
C 3 2 9 2 5
C 3 2 9 2 5
E 5 5 4 1 1
G
对我有什么建议吗?感谢!
答案1
通过一些调整,您可以从精心的尝试中获得所需的结果。为了得到第一个想要的结果,
awk -F"\t" '
BEGIN { OFS = FS }
NR == FNR { a[$NF] = $0; pos = NF; next }
{ if ( $NF in a ) { $NF = a[$1]; } else { $pos = $1; $1 = ""; } } 1
' a.txt b.txt
答案2
使用csvjoin
:
$ csvjoin -H --tabs --left -c 1,6 b.txt a.txt | csvformat -K 1 -T
-H
:输入tsv
文件没有标题行。
--tsbs
或-t
:输入文件已tab
分隔。
--left
执行完全外连接。
-c 1,6
按第一个文件的第 1 列与第二个文件的第 6 列连接。
csvformat
选项:
-K 1
删除由命令添加的第一个标题行csvjoin
。
-T
将分隔符从 更改comma
为tab
。