使用awk连接来自不同文件的多列

Lul*_*ina 5 awk text-processing join

我有 4 个 tsv(制表符分隔)文件,如下所示:

文件_1:

abc 1
def 2
ghi 3
Run Code Online (Sandbox Code Playgroud)

文件_2:

abc 2
ghi 3
Run Code Online (Sandbox Code Playgroud)

文件_3:

def 1
ghi 2
jkl 4
Run Code Online (Sandbox Code Playgroud)

文件_4:

ghi 3
jkl 4
Run Code Online (Sandbox Code Playgroud)

我想加入这些文件以获得 1 个 tsv 文件,如下所示:

dataset file_1 file_2 file_3 file_4
abc     1      2             
def     2      4            
ghi     3      3      2      3
jkl                   4      4
Run Code Online (Sandbox Code Playgroud)

我尝试使用 awk

$ awk '
    BEGIN{OFS=FS="\t"} 
    FNR==1{f = f "\t" FILENAME} 
    NR==FNR{a[$1] = $2} 
    NR!=FNR{a[$1] = a[$1] "\t" $2} 
    END{printf "dataset%s\n", f; for(i in a) print i, a[i]}
  ' file_{1..4}
Run Code Online (Sandbox Code Playgroud)

这个命令是有效的,但我得到了转移的价值。假设第一列和第二列的值为空,而第三列和第四列的值为 4 和 4,我从该命令获得的输出是第一列和第二列的值为 4,但第三列和第四列的值为空值。所以我尝试使用awk我提到的单独加入我的 tsv 文件。先只for file_1and file_2to get output_1,然后join file_3and file_4to get output_2。之后我使用$ join output_1 output_2合并 output_1 和 output_2 但我只得到存在于 4 文件中的值。我丢失了仅存在于一个文件中的数据。

如果您能给我建议,我将不胜感激。

谢谢

Ed *_*ton 7

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ datasets[$1]; fnames[FILENAME]; vals[$1,FILENAME] = $2 }
END {
    printf "%s", "dataset"
    for (fname in fnames) {
        printf "%s%s", OFS, fname
    }
    print ""
    for (dataset in datasets) {
        printf "%s", dataset
        for (fname in fnames) {
            printf "%s%s", OFS, vals[dataset,fname]
        }
        print ""
    }
}

$ tail -n +1 file?
==> file1 <==
a       1
b       2
c       3

==> file2 <==
a       2
c       3

$ awk -f tst.awk file1 file2
dataset file1   file2
a       1       2
b       2
c       3       3
Run Code Online (Sandbox Code Playgroud)

根据需要将任意数量的文件添加到列表中。