ファイル1:
23455|abc|xyz
23455|abc|xsd
34433|wer|sad
45655|fdf|fcd
ファイル2:
v343v|23455
z565z|23455
c9898|34433
b2323|45655
出力は次のようになります。
23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323
次のコマンドを使用しています。
awk -F'|' 'NR==FNR { a[$1]=$1"|"$2"|"$3; next} $2 > 0 {print a[$2] "|" $1}' file1 file2 > result.txt
ただし、結果のみが表示されます。
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323
注:2つのファイルのデータはランダムな順序になっています。
答え1
$ join -t '|' -2 2 file1 file2
23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323
これにより、2つのファイルに対してリレーショナルJOIN操作が実行されます。入力データでフィールド区切り文字として使用するように指示し、2つのファイルの最初のファイルの-t '|'
代わりに2番目のファイルの2番目のフィールドを使用するように指示しますjoin
。|
-2 2
これは、結合列が両方のファイルでソートされていると仮定します。
ソートされていない場合は、次のようにファイルを事前にソートします。
sort -t '|' -k1 -o file1 file1
sort -t '|' -k2 -o file2 file2
join
または、プロセスオーバーライドを使用して、この機能をサポートするシェルの呼び出しと同時に並べ替えます。
join -t '|' -2 2 \
<( sort -t '|' -k1 file1 ) \
<( sort -t '|' -k2 file2 )
答え2
使用awk
:
awk 'BEGIN{FS=OFS="|"}NR==FNR{a[$0];next}{for(i in a)if(index(i,$2)==1) print i,$1}' file1 file2
for
配列に保存されているfile1のすべての行を繰り返しますa
。 2番目のファイルの最初の要素が配列項目と一致する場合に印刷します。