Shell

比較三個文件:使用列比較在所有文件中存在的行

  • October 21, 2019

我有三個文件2d.tsv, 3d.tsv, 4d.tsv, 並且它們的格式相同(列數相同,數據類型相同,但行數不同)。

2d_new.tsv我想通過比較第 3 列並寫入三個新文件 , ,來選擇所有文件中存在的行3d_new.tsv4d_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

我相信有些超級巨星會想出一個驚人的單桿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

引用自:https://unix.stackexchange.com/questions/547613