我有四个这样的 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"
或BEGIN
块END
。
使用磨坊主
$ 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