我正在尝试合并一些选项卡分隔的文件:
文件_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
加入多个文件