我正在处理一个文件,其中字段由单个空格分隔。
awk 将 FS
" "
解释为“一个或多个空格”,当其中一个字段为空时,它会误读我的文件。
我尝试使用“空格后不跟空格”(
" (?! )"
) 作为 FS,但 awk 不支持负向前瞻。像“单空格字段分隔符 awk”这样的简单谷歌查询只会将我带到手册页,解释 FS=" "
的特殊处理。我肯定错过了相关的手册页...
如何使用 awk 使用单个空格作为字段分隔符?
这应该有效
$ 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
针对此行为提供一些有用的联机帮助页参考:
默认字段拆分解释说,
" "
是默认值,但具有特殊含义:
字段分隔符的默认值
是包含单个空格的字符串,FS
。" "
如果 awk 以通常的方式解释该值,每个空格字符将分隔字段,因此一行中的两个空格将在它们之间形成一个空字段。
这种情况不会发生的原因是单个空格作为
的值是一种特殊情况——它用于指定分隔字段的默认方式。FS
正则表达式字段分割解释了如何分隔单个空格:
对于一个不太简单的正则表达式示例,请尝试使用单个空格来分隔字段,就像使用单个逗号一样。
可设置为FS
(左括号、空格、右括号)。"[ ]"
此正则表达式匹配单个空格,不匹配其他内容(请参阅正则表达式)。
(添加了强调和段落。)