あるファイルの列を別のファイルの別の列として検索

あるファイルの列を別のファイルの別の列として検索

列が異なる2つのファイルがあります。

File1:

pears   are fruits
apple   is  fruit
carrot  is  veg
celery  is  vegetable
oranges are fruits

File2:

fruits apple   mycode is #q123c# for apple
fruits pears   my code is #q432c# for juicy
veg    celery  my code value is #q989c# for vegetables
veg    spinach code is #q783c# and is a type of vegetable
fruits papaya  i have code #q346c#
vegie  lettuce code #q445c# is vege

理想的な出力ファイルが必要です。

Q432C pears fruits
Q123C apple fruit
Q---C carrot veg
Q989C celery vegetable
Q---C oranges fruits

File1の列1をFile1の列2と比較する必要がありますFile2。一致するものがある場合は、2つの#フィールド内にq-to-cコードを印刷しFile2、それ以外の場合は空のコードを印刷しますq---c。 QCコードを大文字に変換します。

私は出力がFile1

理想的には、出力ファイルにq-to-cコードが含まれてからFile2それを追加する必要があります。しかし今、私は一致する行からq-to-cコードを削除して大文字にするFile1方法を見つけました。File2

awk 'NR==FNR { a[$1]=1; next } ($2 in a) {print $0} ' File1 File2 | sed -e 's/.*#\(.*\)#.*/\1/' | tr [a-z] [A-Z] > outputFile

...誰を助けることができますか?私はawkスクリプトが初めてです。

上記の結果を得た後に接続しようとしましたが、生成した出力ファイルにIの行がないため、正しいq-to-cコードを正しい行にリンクできない危険がありますFile1
他の解決策を共有することを喜んで受け入れますawk

誰でも助けることができればとても感謝します。 :)
よろしくお願いします。

答え1

シングルawk注文する:

awk 'NR == FNR{
         match($0, /#q[0-9]{3}c#/);
         fruits[$2] = substr($0, RSTART + 1, RLENGTH - 2);
         next
     }
     { print ($1 in fruits? toupper(fruits[$1]) : "Q---C"), $1, $3 }' file2 file1

出力:

Q432C pears fruits
Q123C apple fruit
Q---C carrot veg
Q989C celery vegetable
Q---C oranges fruits

関連情報