比较三个文件:使用列比较来比较所有文件中存在的行

比较三个文件:使用列比较来比较所有文件中存在的行

我有三个文件2d.tsv3d.tsv4d.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那么只需|joinawk

相关内容