我有这种格式的数据,我想根据每列中的标签对其进行排序。想要用逗号 ( ,
) 替换缺失的字段,如下所示
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
数组表示的内容进行比较。如果存在不匹配,则从该点开始的字段将“右移”一个位置,并且当前字段被清空。
然后,所有字段将重新格式化为 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