AWK:行のパターン位置に関係なく、2つのカスタムフィールド区切り文字の間でパターンを抽出する方法は?

AWK:行のパターン位置に関係なく、2つのカスタムフィールド区切り文字の間でパターンを抽出する方法は?

以下はファイルの1行の断片です。

LN=FINE FOODS & PHARMACEUTICALS NTM, MIC=XAIM, RIC=FF.MI, SG=MA1

「MIC」タグの値を抽出することに興味があります。つまり、私が望む出力は次のようになります。

XAIM

完全なコード行はかなり長いです。

20200403: #379 IT0005215329 {CU=EUR, GTPID=144115188076657542, II=IT0005215329, IS=18814564, LN=FINE FOODS & PHARMACEUTICALS NTM, MIC=XAIM, RIC=FF.MI, SG=MA1, SN=801670, STY=ORDINARY, TK="0.0002 to 0.1,0.0005 to 0.2,0.001 to 0.5,0.002 to 1,0.005 to 2,0.01 to 5,0.02 to 10,0.05 to 20,0.1 to 50,0.2 to 100,0.5 to 200,1 to 500,2 to 1000,5 to 2000,10 to 5000,20 to 10000,50 to 20000,100 to 50000,200", TS=FF, TY=S, UQ=1}

ライン上の「MIC」ラベルの位置は常に同じではありません。

私はかなり多くのチュートリアルを読んでおり、すべてのソリューションはカスタムフィールド区切り文字を作成し、行のパターン位置を使用して目的のパターンを抽出するようです。

たとえば、私は次に与えられた例に従おうとしました。このスレッドつまり、このコードを使用して「MIC」タグから値を抽出します。

awk 'BEGIN {FS="MIC=|,"} {print $2}' input.txt

次の結果が表示されます。

GTPID=144115188076657542

上記の完全な行の例を確認すると、出力は「=」記号を持つ2番目のタグ「GTPID」の値です。最初に、私はこれが{FS="MIC=|,"}「2つのカスタムフィールド区切り文字を生成することを意味すると思いました。最初のものは、MIC=2番目はです,{print $2}

ただし、上記のコードは、「=」記号を含むすべてのパターンの値を印刷するようです。この記号はその行の 2 番目の記号です。

その間のMIC=値を抽出する方法は,

ベストアンサー1

f[]データに名前と値のペアがある場合は、まずマッピング(下)をキャプチャする配列を作成し、その名前で目的のフィールドにアクセスできることをお勧めします。たとえば、次のようになります。

$ awk -F'[=,] *' '{for (i=1;i<NF;i+=2) f[$i]=$(i+1); print f["MIC"]}' file
XAIM

テスト値を調整し、他のフィールドをランダムな順序で印刷するなどの作業がどれほど簡単かを確認してください。

awk -F'[=,] *' '
    { for (i=1;i<NF;i+=2) f[$i]=$(i+1) }
    (f["MIC"] == "XAIM") && (f["LN"] ~ /FOOD/){ print f["SG"], f["RIC"] }
' file
MA1 FF.MI

おすすめ記事