File2(標準ファイル)のフィールドを使用して、File1から一致する文字列を印刷したいと思います。以下のawkコマンドを試しましたが、結果の最初の行だけを印刷するのではなく、File1文字列から一致するすべてのフィールドを取得したいと思います。
cat File1
AAA,20190221,00-00,100
AAA,20190221,01-00,110
AAA,20190221,02-00,120
BBB,20190221,00-00,110
BBB,20190221,01-00,110
BBB,20190221,02-00,110
CCC,20190221,00-00,110
CCC,20190221,01-00,140
CCC,20190221,02-00,150
cat File2
AAA
BBB
以下のawkメソッドを使用しています。
awk -F"," -f vlookup.awk File1 File2
(cat vlookup.awk)
FNR==NR{
a[$1]=$4
next}
{ if ($1 in a) {print $1"," a[$1]} else {print $1, "NA"} }
私が得た結果は次のとおりです。
AAA,100
BBB,110
NA
ただし、時々増減することができるFile1のすべての値を印刷する必要があります。私の予想結果は
AAA,100
AAA,110
AAA,120
BBB,110
BBB,110
BBB,110
答え1
AWKスクリプトは列1をインデックスとして使用して、File1
列1の各キーの列4の最後の値を配列に格納します。a
次に、すべての配列キーと値を印刷しますFile2
。
入力ファイルの順序を変更してキー配列を作成し、その配列と行を比較する必要がFile2
ありFile1
ます。
vlookup2.awk
FNR==NR {
a[$0]=1 # Set a value in array a using current line as index
next # Stop processing this line, do not check other rules
}
$1 in a { # if column1 matches any index in array a
print $1 "," $4 # the columns you want
}
走る
awk -F "," -f vlookup2.awk File2 File1
得るために
AAA,100
AAA,110
AAA,120
BBB,110
BBB,110
BBB,110
注:私はFile2を最初のパラメータとして使用しています。
注:AWKスクリプト、サンプルファイル、および出力に問題があるようです。 2行が出ます
AAA,120
BBB,110
これはFile1の最後の数行で、列1のキーに対応します。出力例には、の最初の行が表示されますAAA
。
並ぶ
NA
(前にスペースが入っていますNA
)File2の後に空白行が続く場合にのみ適用されますBBB
。