2つのファイルの2つの列の文字列に基づいて行を連結する

2つのファイルの2つの列の文字列に基づいて行を連結する

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このオプションを使用します。file1file2

残念ながら、joinfile1のキーフィールドは各レコードの先頭に配置されます。値の一時保有者として$ 1という変数を使用して、awkフィールドを元の順序に戻してこの問題を解決します。tファイル間に矛盾がある場合、awkスクリプトは$ 4フィールドに末尾のダッシュ文字も追加します(それjoin自体は実行しないため)。

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

関連情報