3つのファイル比較:列比較を使用して、すべてのファイルの行を比較します。

3つのファイル比較:列比較を使用して、すべてのファイルの行を比較します。

同じ形式(同じデータ型の同じ数の列、しかし異なる行数)を持つ3つのファイルが2d.tsvあり3d.tsvます。4d.tsv

2d_new.tsv3番目の列を比較して3つの新しいファイルに書き込んで、すべてのファイルの3d_new.tsv行を選択したいと思います。4d_new.tsvつまり、3つの新しいファイルが同じ行数を持ち、それに応じて元の最初の列を維持したいと思います。 2番目の列を残りの行にリンクします。これを行う方法をお手伝いできますか?

入力例:

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

関連情報