可以分开空白字段吗?

时间:2016-07-19 03:46:39

标签: bash awk

我正在尝试使用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,

空的第三个字段未正确分隔。 有没有人有解决这个问题的方法?

2 个答案:

答案 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

这可以消除不必要的空间。