如何合并 TSV 文件

如何合并 TSV 文件

我有四个这样的 TSV 文件:

文件1:

abc \t 1
def \t 3
ghi \t 5

文件2:

abc \t 10
def \t 4
ghi \t 7

文件3:

abc \t 8
def \t 5
ghi \t 1

文件4:

abc \t 4
def \t 2
ghi \t 1

我想将这些 TSV 文件合并为一个 TSV,如下所示:

dataset \t file_1 \t file_2 \t file_3 \t file_4
abc \t 1 \t 10 \t 8 \t 4
def \t 3 \t 4 \t 5 \t 2
ghi \t 5 \t 7 \t 1 \t 1

我怎样才能得到它?

答案1

使用 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}
dataset file_1  file_2  file_3  file_4
def     3       4       5       2
abc     1       10      8       4
ghi     5       7       1       1

如果您需要排序输出,请通过管道传输结果sort或(假设 GNU awk 4.0 或更高版本)添加PROCINFO["sorted_in"] = "@ind_str_asc"BEGINEND


使用磨坊主

$ cat file_{1..4} | mlr --tsv --implicit-csv-header --headerless-csv-output --quote-none \
    nest --implode --values --across-records -f 2 --nested-fs tab
abc     1       10      8       4
def     3       4       5       2
ghi     5       7       1       1

使用足够新的 Miller 版本,你可以使用简写nest --ivar tab -f 2代替nest --implode --values --across-records -f 2 --nested-fs tab

答案2

使用 Miller (https://github.com/johnkerl/miller)并运行

mlr -N --tsv nest --ivar ";" -f 2 then nest --explode --values --across-fields -f 2 0*.tsv

你将会拥有

abc     1       10      8       4
def     3       4       5       2
ghi     5       7       1       1

相关内容