linux:あるファイルから別のファイルとしてvlookupを使用する

linux:あるファイルから別のファイルとしてvlookupを使用する

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

おすすめ記事