列に基づいて欠落しているデータ型の指定と入力

列に基づいて欠落しているデータ型の指定と入力

この形式のデータがあり、各列のラベルに基づいてソートしたいと思います。不足しているフィールドを以下のようにコンマ()に,置き換えようとしています。

2018-03-13 02:09:12,AB=123,BC=6,CAB=Jax,XYZ=Xax
2018-03-13 02:09:13,AB=234,BC=6,CAB=Jax,XYZ=Ram
2018-03-13 02:11:03,AB=567,BC=6,XYZ=Xulu

予想される結果。

2018-03-13 02:09:12,    AB=123, BC=6,   CAB=Jax,    XYZ=Xax
2018-03-13 02:09:13,    AB=234, BC=6,   CAB=Jax,    XYZ=Ram
2018-03-13 02:11:03,    AB=567, BC=6,          ,    XYZ=Xulu

ベストアンサー1

BEGIN { OFS = FS = "," }

FNR==1 {
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        f[i] = a[1]
    }
}

{
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        if (a[1] != f[i]) {
            for (j = NF + 1; j > i; --j)
                $j = $(j - 1)
            $i = ""
        }

        $i = sprintf("%10s", $i)
    }

    print
}

このawkプログラムは、入力ファイルの最初の行が次のようになると仮定します。正しいこれは正しい場所にすべてのフィールドが含まれているためです。

次のテキストでは、「すべてのフィールド」と「フィールド」は、変更されていない最初のフィールドを除くすべてのフィールドを表します。

=最初の行の場合のみ、フィールドの前のビットを読み取り、それを配列内の対応するフィールドのf位置に格納します。

すべての行に対してフィールド内容に対して同じタイプの分割を実行し、前の=ビットを配列が表すものと=比較fします。不一致がある場合、その時点で始まるフィールドが1つの位置「右に移動」され、現在のフィールドがクリアされます。

その後、すべてのフィールドは10文字の右揃え文字列に再フォーマットされ、変更されたレコード全体(行)が印刷されます。

サンプルデータから実行:

$ awk -f script.awk file
2018-03-13 02:09:12,    AB=123,      BC=6,   CAB=Jax,   XYZ=Xax
2018-03-13 02:09:13,    AB=234,      BC=6,   CAB=Jax,   XYZ=Ram
2018-03-13 02:11:03,    AB=567,      BC=6,          ,  XYZ=Xulu

おすすめ記事