Shell
比較三個文件:使用列比較在所有文件中存在的行
我有三個文件
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
我相信有些超級巨星會想出一個驚人的單桿
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