同じ形式(同じデータ型の同じ数の列、しかし異なる行数)を持つ3つのファイルが2d.tsv
あり3d.tsv
ます。4d.tsv
2d_new.tsv
3番目の列を比較して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
以下を|
追加します。join
awk