ファイルが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
一度に各ファイルの数行だけメモリに保存できます。
答え2
努力する:
awk 'FNR==NR{seen[$1]=$2; next} seen[$NF]{print $0, seen[$NF]}' file2 file1
$1 列のキーを使用して、$2 列の対応する値を次の連想配列に格納します。ボンいつアッ読み取り専用ファイル2ここでNR==FNR
、(読み取る入力ファイルが複数ある場合は、最初の入力ファイルに対して常にtrue)は、最初のNR
レコード/行読み取りで1に設定されます。アッ単一の入力ファイルまたは複数のファイルのすべてのレコード/行を読み取るまでインクリメントし、FNR
最初のレコード/行読み取りで1に設定されます。アッ現在の入力ファイルからすべてのレコード/行を読み取るまでインクリメントし、次のファイルで再び1にリセットされます。
最後の列の値が表示された配列の同じキー値と一致する場合、次のブロックは行全体を印刷します。ファイル1そして配列内の同じキーの値です。