ファイルが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 4
file2
この-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
一度に各ファイルの数行だけメモリに保存できます。