列が異なる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