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