IDが一致したときに別のファイルの列をコピーする方法

IDが一致したときに別のファイルの列をコピーする方法

ファイルが2つありますが、

head file1

    1   115258827   12 HG00099
    1   115258827   5 HG00100
    1   115258827   8 HG00101
    1   115258827   6 HG00103
    1   115258827   4 HG00108
    1   115258827   3 HG00110
    1   115258827   4 HG00111
    1   115258827   2 HG00114
    1   115258827   8 HG00115
    1   115258827   5 HG00116

そして別のファイル

head file2
HG00096 0|0
HG00097 0|0
HG00099 0|0
HG00100 0|1
HG00101 0|0
HG00102 0|0
HG00103 0|0
HG00105 0|0
HG00106 0|0
HG00107 0|0

file1 の最後の列が file2 の最初の列と一致することを確認し、file2 の 2 番目の列を file1 に追加し、次のように終了したいとします。

head desired
1   115258827   12 HG00099 0|0
1   115258827   5 HG00100  0|1
1   115258827   8 HG00101  0|0
1   115258827   6 HG00103  0|0

ベストアンサー1

データをマージ/結合するフィールドがソートされているとします。

$ join -1 4 -o1.1,1.2,1.3,0,2.2 file1 file2
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0

これにより、4番目の列(ファイルの最初の列ではないためfile1指定)と1番目の列(ファイルをソートする必要がある列)の2つのファイルが結合されます。-1 4file2

この-oフラグは、join出力で見たいフィールドとそのフィールドをインポートするファイルを示します(1.3たとえば、「最初のファイルの3番目のフィールド」、0結合フィールドを意味します)。

使用の利点joinは、両方のファイルがメモリに完全に読み込まれる必要がないことです。


ファイルがソートされていない場合は、次の方法を使用してファイルを一度に事前にソートできます。

sort -k4 -o file1 file1
sort     -o file2 file2

または、プロセス置換を理解するシェルを使用している場合は、次のように結合中にソートできます。

join -1 4 -o1.1,1.2,1.3,0,2.2 <( sort -k4 file1 ) <( sort file2 )

ソートされたデータは、join一度に各ファイルの数行だけメモリに保存できます。

おすすめ記事