连接多个文件的特定列,并将文件名保留为列名



我正在尝试合并一些选项卡分隔的文件:

文件_A.tsv

probeId   BetaVal    Annot
a         1         X
b         2         Y
c         3         Z

文件_.tsv

probeId   BetaVal    Annot
a         4         X
b         5         Y
c         6         Z

文件_C.tsv

probeId   BetaVal    Annot
a         7         X
b         8         Y
c         9         Z

如何通过BetaVal列合并这些文件,并将文件名设置为列名(同时获得一个制表符分隔的文件(?

probeId  File_A.tsv   File_B.tsv   File_C.tsv   Annot
a           1           4             7         X
b           2           5             8         Y
c           3           6             9         Z

我在尝试类似的东西:

for file in *;
do
join -j 1 File_A file;
done

但这是不对的。此外,我不知道如何将文件名写成列名。

您可以使用此gnu awk:

awk -v OFS='t' '{
a[$1][ARGIND] = (FNR==1?FILENAME:$2)
b[$1] = $3
}
END {
for (i in a) {
printf "%s", i
for(j in a[i])
printf "%s%s", OFS, a[i][j]
print OFS b[i]
}
}' File_[ABC].tsv | column -t

probeId  File_A.tsv  File_B.tsv  File_C.tsv  Annot
a        1           4           7           X
b        2           5           8           Y
c        3           6           9           Z
echo -e "nprobeId  File_A.tsv   File_B.tsv   File_C.tsv   Annot";
join -o 1.1 1.2 2.2 2.3 -1 1 -2 1 File_A.tsv File_B.tsv|
join -o 1.1 1.2 1.3 2.2 1.4 -1 1 -2 1 - File_C.tsv |
awk '{printf(" %-8s %-12s %-12s %-12s %sn", $1,$2,$3,$4,$5);}'|tail +2
probeId  File_A.tsv   File_B.tsv   File_C.tsv   Annot
a        1            4            7            X
b        2            5            8            Y
c        3            6            9            Z

我假设第一列是关键字段,我试着猜测你的想法,但最好阅读这些链接了解join:

https://linuxconfig.org/learning-linux-commands-join

https://landoflinux.com/linux_join_command.html

加入多个文件

相关内容

  • 没有找到相关文章

最新更新