複数の列を使用して 2 つのファイルを比較し、両方のファイルから行を印刷する

複数の列を使用して 2 つのファイルを比較し、両方のファイルから行を印刷する

次のような形式の2つのフラットファイルがあります

ファイル1.txt

Customer1 12345 12346 12347 15646
Customer2 14444 14445

ファイル2.txt

12345 aol.com
12347 gmail.com
12346 google.com
14444 yahoo.com
14445 outlook.com
15646 space.com

私の Desire の出力は次のようになります:

Customer1 aol.com gmail.com google.com space.com
Customer2 yahoo.com outlook.com

これまで、次のことを思いつきましたが、ファイル 1 の列 2 のみが使用されているようです。このコマンドを拡張して、ファイル 1 のすべての列を含める方法はありますか?

awk 'NR==FNR {a[$1]=$2; next} $2 in a {print $0, a[$2]}' OFS='\' file2.txt file1.txt

答え1

$2以降のフィールドをループする必要がありますFile1.txt:

$ awk 'NR==FNR {a[$1]=$2; next} {for (i=2;i<=NF;i++) $i = $i in a ? a[$i] : $i} 1' File2.txt File1.txt
Customer1 aol.com google.com gmail.com space.com
Customer2 yahoo.com outlook.com

一致することが確実な場合、または一致しない部分を空のフィールドに置き換える場合は、$i = $i in a ? a[$i] : $iを に簡略化できます。$i = a[$i]

関連情報