2 つのファイルの 2 つの列の文字列に基づいて行を結合します。

2 つのファイルの 2 つの列の文字列に基づいて行を結合します。

Linux システムに 3 列のファイル 1 と 4 列のファイル 2 があります。ファイル 1 の列 3 の文字列とファイル 2 の列 2 の文字列に基づいて 2 つのファイルを結合するにはどうすればよいでしょうか。ファイル 2 は多数のエントリを持つ大きなデータベースです。ファイル 1 とファイル 2 の列 3 と列 2 はそれぞれわずかな文字列しか共有していません。文字列が一致する場合は結合されたファイル 2 の行を含むファイル 1 を出力し、一致しないエントリにはダッシュを出力したいと思います。

ファイル1:

300 100 a101
450 410 a400
670 710 a20
700 610 a340

ファイル2:

b30  a340 tttttttt 456
b500 a200 llllllll 567
b60  a101 uuuuuuuu 344
b40  a50  kkkkkkkk 223

出力:

300 100 a101 b60 a101 uuuuuuuu 344
450 410 a400 -
670 710 a20  -
700 610 a340 b30 a340 tttttttt 456

答え1

Linux の標準であるGNUawkと GNUを使用します (GNU 以外のバージョンでは動作しない場合があります)。join

$ join -a1 -1 3 -2 2 <(sort -k3,3 file1) <(sort -k2,2 file2) | 
    awk '$4 == "" { $4 = "-" }; {t=$1; $1=$2; $2=$3; $3=t; print}' |
    sort
300 100 a101 b60 uuuuuuuu 344
450 410 a400 -
670 710 a20 -
700 610 a340 b30 tttttttt 456

このjoinコマンドは、file1とfile2をそれぞれフィールド3と2で結合します。プロセス置換両方のファイルがそれぞれのキー フィールドでソートされるようにします。の行と一致しない場合でも、-a 1のすべての行が印刷されるように、オプションが使用されます。file1file2

残念ながら、 は、join各レコードの先頭にファイル 1 のキー フィールドを配置します。これは、 $1 の値を一時的に保持awkする変数を使用して、フィールドを元の順序に戻すことで修正さtれます。awk スクリプトは、ファイル間で一致がなかった場合、フィールド $4 に末尾のダッシュ文字も追加します (スクリプトjoin自体はこれを行わないため)。

最後に、出力がソートされます。

関連情報