
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
のすべての行が印刷されるように、オプションが使用されます。file1
file2
残念ながら、 は、join
各レコードの先頭にファイル 1 のキー フィールドを配置します。これは、 $1 の値を一時的に保持awk
する変数を使用して、フィールドを元の順序に戻すことで修正さt
れます。awk スクリプトは、ファイル間で一致がなかった場合、フィールド $4 に末尾のダッシュ文字も追加します (スクリプトjoin
自体はこれを行わないため)。
最後に、出力がソートされます。