我正在尝试使用awk处理一个文件,其中每种类型的数据都有固定的最大长度,但实际数据长度可能小于最大长度,数据甚至可能是空的。
让我们简化问题,
echo 'a b d e f' | awk -v FIELDWIDTHS="1 1 1 1 1 1" -v OFS=, '{print $1,$2,$3,$4,$5,$6}'
我在一行中有六个字段,它们的长度只有1,但在这种情况下第三个字段是空的。 预期的输出应该是
a,b,,d,e,f
但我得到的是
A,B,d,E,F,
空的第三个字段未正确分隔。 有没有人有解决这个问题的方法?
答案 0 :(得分:1)
在这种情况下,您不能依赖依赖于分隔符的内置字段拆分。相反,您需要将FIELDWIDTHS转换为列位置和宽度(1,1) (3,1) (5,1) (7,1) (9,1) (11, 1)
,然后使用substr
来提取数据:
$ echo 'a b d e f' | awk '{print substr($0, 3, 1)}'
b
$ echo 'a b d e f' | awk '{print substr($0, 5, 1)}'
答案 1 :(得分:0)
这会重现您的结果:
$ echo 'a b d e f' | mawk -v FIELDWIDTHS="1 1 1 1 1 1" -v OFS=, '{print $1,$2,$3,$4,$5,$6}'
a,b,d,e,f,
至于为什么它没有按预期工作,请注意你得到相同的结果没有 FIELDWIDTHS:
$ echo 'a b d e f' | mawk -v OFS=, '{print $1,$2,$3,$4,$5,$6}'
a,b,d,e,f,
这是因为mawk(Mike的awk)忽略了FIELDWIDTHS。如果你想要FIELDWIDTHS,你必须使用GNU awk。但是,请注意,将字段宽度设置为1并不能达到您想要的效果:
$ echo 'a b d e f' | gawk -v FIELDWIDTHS="1 1 1 1 1 1" -v OFS=, '{print $1,$2,$3,$4,$5,$6}'
a, ,b, , ,
这是因为,当使用FIELDWIDTHS时,GNU awk假定存在 no 字段分隔符。如果你真的想这样做并保持你想要的字段编号,你需要将字段宽度设置为2:
$ echo 'a b d e f' | gawk -v FIELDWIDTHS="2 2 2 2 2 2" -v OFS=, '{print $1,$2,$3,$4,$5,$6}'
a ,b , ,d ,e ,f
除了标记的额外空间,这就是你想要的。
或者,正如评论中建议的anishsane,如果您愿意更改字段编号,则可以使用单字符字段宽度。在输出中仅使用奇数编号的字段:
$ echo 'a b d e f' | awk -v FIELDWIDTHS="1 1 1 1 1 1 1 1 1 1 1 1" -v OFS=, '{print $1,$3,$5,$7,$9,$11}'
a,b, ,d,e,f
这可以消除不必要的空间。