如何连接多个文件中的特定列

nst*_*tam 1 awk text-processing

我有一个数据文件A.tsv(字段分隔符 = \t):

id  clade   mutation
243 40A SDF
254 20B
261 40A
267 20B
Run Code Online (Sandbox Code Playgroud)

B.tsv(字段分隔符 = \t):

id  clade   mutation
243 40A
254 20B
261 40A
267 20B SLT
Run Code Online (Sandbox Code Playgroud)

C.tsv(字段分隔符 = \t):

id  clade   mutation
243 40A
254 20B
261 40A MGG
267 20B
Run Code Online (Sandbox Code Playgroud)

我想将所有文件连接成一个,知道所有文件之间唯一不同的列是 column mutation。预期的结果是:

id  clade   mutation
243 40A SDF
254 20B
261 40A MGG
267 20B SLT
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过:

awk 'BEGIN{FS=OFS="\t"} NR==FNR{klos[NR]=$3; next} $3==""{$3=klos[FNR]} 1' *.tsv > output.tsv
Run Code Online (Sandbox Code Playgroud)

但它没有用。你有办法做到这一点吗?谢谢

PS:这是一个示例测试,在我的实际情况下,我有 3 个以上的文件。但是像示例一样,mutation列中没有两个具有相同内容的文件。

Ed *_*ton 5

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
(NR == FNR) || ($3 != "") {
    fnr2rec[FNR] = $0
}
FILENAME == ARGV[ARGC-1] {
    print fnr2rec[FNR]
}
Run Code Online (Sandbox Code Playgroud)

$ awk -f tst.awk A.tsv B.tsv C.tsv
id      clade   mutation
243     40A     SDF
254     20B
261     40A     MGG
267     20B     SLT
Run Code Online (Sandbox Code Playgroud)