CSV ファイルから、一致パターンに基づいてパターンと一致する別の値を取得します。

CSV ファイルから、一致パターンに基づいてパターンと一致する別の値を取得します。

これには専門家のアドバイスが必要です

AMOUNT,30,/AMOUNT,MESS,Am,/MESS,AMOUNT,30,/AMOUNT,TXN,209,/TXN  
MESS,SU,/MESS,TXN,200,/TXN,AMOUNT,70,/AMOUNT       
TXN,200,/TXN,AMOUNT,90,/AMOUNT,MESS,SUM,/MESS,AMOUNT,90,/AMOUNT   

ORが生成される特別な順序はありませんが、AMOUNTすべての行に両方の値があります。一部の行には TXN重複した項目もあります。AMOUNT

次の出力が必要です

AMOUNT,30,/AMOUNT,TXN,209,/TXN   
AMOUNT,70,/AMOUNT,TXN,200,/TXN   
AMOUNT,90,/AMOUNT,TXN,200,/TXN    

誰もが私を助けることができれば非常に役立ちます。

答え1

awk -F ',' '
BEGIN { OFS = FS }
{
    a = t = "N/A"

    for (i = 1; i < NF; ++i)
        if ($i == "AMOUNT")
            a = $(i + 1)
        else if ($i == "TXN")
            t =$(i + 1)

    $0 = ""

    $1 = "AMOUNT"
    $2 = a
    $3 = "/AMOUNT"

    $4 = "TXN"
    $5 = t
    $6 = "/TXN"

    print
}' file

各行のカンマ区切りフィールドで文字列の合計を見つけますAMOUNT。見つかるTXNと、次のフィールドのデータが割り当てられます。同様に値を割り当てます。いずれかの値が見つからない場合は文字列になります。AMOUNTatTXNN/A

その後、出力を生成します。

より短いバージョン:

awk -F ',' '
{
    a = t = "N/A"

    for (i = 1; i < NF; ++i)
        if ($i == "AMOUNT")
            a = $(i + 1)
        else if ($i == "TXN")
            t =$(i + 1)

    printf "AMOUNT,%s,/AMOUNT,TXN,%s,/TXN\n", a, t
}' file

出力ビットのみが異なります。出力する代わりに記録、我々は生成された文字列を出力しますprintf

関連情報