Linuxシステムには、3つの列を持つfile1と4つの列を持つfile2があります。 file1の列3の文字列に基づいて2つのファイルをfile2の列2の文字列にリンクするにはどうすればよいですか? File2 は、アイテムの多い大規模データベースです。 file1とfile2の列3と2は、それぞれいくつかの文字列のみを共有します。文字列が一致する場合は、file1に関連付けられたfile2行を出力し、一致しない項目にはダッシュを出力したいと思います。
ファイル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
コマンドは、それぞれフィールド 3 と 2 で file1 と file2 を連結します。それを使うプロセスの交換両方のファイルが対応するキーフィールドでソートされていることを確認してください。の行と一致しなくても、すべての行を印刷するには、-a 1
このオプションを使用します。file1
file2
残念ながら、join
file1のキーフィールドは各レコードの先頭に配置されます。値の一時保有者として$ 1という変数を使用して、awk
フィールドを元の順序に戻してこの問題を解決します。t
ファイル間に矛盾がある場合、awkスクリプトは$ 4フィールドに末尾のダッシュ文字も追加します(それjoin
自体は実行しないため)。
最後に、出力がソートされます。