awk基于公共列合并两个txt文件

awk基于公共列合并两个txt文件

我想使用 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将分隔符从 更改commatab

相关内容