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

问题描述 投票:0回答:2

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

awk 将 FS

" "
解释为“一个或多个空格”,当其中一个字段为空时,它会误读我的文件。

我尝试使用“空格后不跟空格”(

" (?! )"
) 作为 FS,但 awk 不支持负向前瞻。像“单空格字段分隔符 awk”这样的简单谷歌查询只会将我带到手册页,解释
FS=" "
的特殊处理。我肯定错过了相关的手册页...

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

awk gawk
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

0
投票

针对此行为提供一些有用的联机帮助页参考:

默认字段拆分解释说,

" "
是默认值,但具有特殊含义:

字段分隔符的默认值

FS
是包含单个空格的字符串,
" "

如果 awk 以通常的方式解释该值,每个空格字符将分隔字段,因此一行中的两个空格将在它们之间形成一个空字段。

这种情况不会发生的原因是单个空格作为

FS
的值是一种特殊情况——它用于指定分隔字段的默认方式。

正则表达式字段分割解释了如何分隔单个空格:

对于一个不太简单的正则表达式示例,请尝试使用单个空格来分隔字段,就像使用单个逗号一样。

FS
可设置为
"[ ]"
(左括号、空格、右括号)。

此正则表达式匹配单个空格,不匹配其他内容(请参阅正则表达式)。

(添加了强调和段落。)

© www.soinside.com 2019 - 2024. All rights reserved.