使用awk将单个空格作为字段分隔符

17

我正在处理一个文件,其中字段由单个空格分隔。

awk 将 FS " " 解释为 "一个或多个空格",这会导致当其中一个字段为空时,awk 无法正确读取我的文件。

我尝试使用 "不跟随空格的空格"( " (?! )" ) 作为 FS,但是 awk 不支持负向预查。类似 "single space field separator awk" 的简单谷歌查询只将我带到了说明特殊处理 FS=" " 的手册页面上。我可能错过了相关的手册页面......

如何在 awk 中使用单个空格作为字段分隔符?


FS can be set to "[ ]" to use a single space as field separator. - asachet
哦,看起来注释系统吞掉了换行符。实际上我使用 <<< 'a[空格][空格][空格][空格]b' 作为输入。 - hek2mgl
我指的是“吞噬了空格”。 - hek2mgl
@antoine-sac,您能发布一些您的内容和您期望字段是什么的几行吗?请特别注意空字段,无论它是空字符串还是额外的空格。 - karakfa
@hek2mgl 我已经重新阅读了这个问题两次,如果有什么的话,我认为你的理解是错误的。原帖明确询问了一个空字段,我没有看到任何关于包含空格的字段的内容。 - tripleee
显示剩余6条评论
2个回答

31

这应该能够正常工作

$ echo 'a    b' | awk -F'[ ]' '{print NF}'
5

而这个将所有连续的空格看作一个整体。

$ echo 'a    b' | awk -F' ' '{print NF}'
2
基于该评论,它需要特别考虑,空字符串或空格作为字段值是非常不同的事情,可能不适合用于以空格分隔的内容。
我建议使用`cut`进行预处理并更改分隔符,例如:
$ echo 'a    b' | cut -d' ' -f1,3,5 --output-delimiter=,
a,,b

听起来像是 OP 想要 3 而不是 5,因为定界符括起来的两个空格是一个字段 - 一个包含两个空格的字段。 - hek2mgl
@hek2mgl 嗯,不,字段不可能包含字段分隔符。当字段分隔符是单个空格时,两个相邻的空格是一个空字段的分隔符。 - tripleee
@tripleee 对啊。我还是觉得这个问题很有趣,我是说它通常是一个有效的用例,但是在那种情况下,我会选择不同的分隔符。 - hek2mgl
@karafka 不错的想法,改变分隔符,但我的字段中没有任何空格,所以第一个解决方案已经足够了。谢谢! - asachet

0
给出一些有用的manpage参考来解释这个行为: 默认字段分割解释了" "是默认值,但具有特殊含义:
引用:

字段分隔符FS的默认值是一个包含单个空格" "的字符串。

如果awk以通常的方式解释这个值,每个空格字符都会分隔字段,所以连续两个空格之间会产生一个空字段。

之所以不会发生这种情况,是因为将单个空格作为FS的值是一个特殊情况——它被视为指定字段分隔方式的默认方式。

正则表达式字段分割解释了如何分隔单个空格:
对于一个不那么琐碎的正则表达式示例,尝试使用单个空格来分隔字段,就像使用单个逗号一样。`FS` 可以设置为 `"[ ]"`(左括号、空格、右括号)。 这个正则表达式只匹配一个空格,没有其他内容(参见正则表达式)。
(添加了强调和段落格式。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接