![比较三个文件:使用列比较来比较所有文件中存在的行](https://linux22.com/image/162543/%E6%AF%94%E8%BE%83%E4%B8%89%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9A%E4%BD%BF%E7%94%A8%E5%88%97%E6%AF%94%E8%BE%83%E6%9D%A5%E6%AF%94%E8%BE%83%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E8%A1%8C.png)
我有三个文件2d.tsv
、3d.tsv
、4d.tsv
,它们具有相同的格式(具有相同数据类型的相同列数,但行数不同)。
2d_new.tsv
我想通过比较第 3 列并写入三个新文件、3d_new.tsv
、来选择所有文件中存在的行,4d_new.tsv
也就是说,我希望这三个新文件具有相同的行数并根据其保持原始的第一列和第二列到剩余的行。你能帮我怎么做吗?
输入示例:
2d.tsv
0.1 0.22 gene1
0.3 0.1 gene2
0.5 0.33 gene3
0.3 0.44 gene5
0.9 0.3 gene6
3d.tsv
0.4 0.5 gene2
0.6 0.1 gene3
0.1 0.99 gene4
0.01 0.44 gene5
4d.tsv
0.03 0.11 gene1
0.33 0.34 gene2
0.54 1 gene3
0.41 0.44 gene4
0.44 0.45 gene5
0.11 0.89 gene6
期望的输出:
2d_new.tsv
0.3 0.1 gene2
0.5 0.33 gene3
0.3 0.44 gene5
3d_new.tsv
0.4 0.5 gene2
0.6 0.1 gene3
0.01 0.44 gene5
4d_new.tsv
0.33 0.34 gene2
0.54 1 gene3
0.44 0.45 gene5
答案1
我确信有一些超级巨星会想出一个令人惊叹的一击awk
解决方案,但这里有一个大锤。
假设所有文件都在第 3 列的键上很好地排序(如果没有,您需要sort -k 3 file
首先对它们进行排序)。
join -j 3 2d.tsv 3d.tsv | join -1 1 -2 3 - 4d.tsv > tmp
awk '{print $2, $3, $1}' tmp > 2d_new.tsv
awk '{print $4, $5, $1}' tmp > 3d new.tsv
awk '{print $6, $7, $1}' tmp > 4d_new.tsv
最后 3 行可以合并
awk '{ print $2, $3, $1 > "2d_new.tsv"; print $4 $5, $1 > "3d_new.tsv"; print $6, $7, $1 > "4d_new.tsv" }' tmp
如果您想使用单衬管以避免锉刀,tmp
那么只需|
将join
awk