如何将字段分隔符设置为空字符串?

3
awk手册指出,-v FS-F都是设置字段分隔符的等效方式。 GNU Awk用户手册 -> 4.5.4从命令行设置FS:
FS可以在命令行上设置。使用`-F'参数即可。
(...)
传递给`-F'的参数值与对内置变量FS的赋值处理方式完全相同。
然而,我注意到如果将其设置为空字符串,则存在差异。在我的GNU Awk 4.1.1上进行测试。
这个有效:
$ awk -F, '{print $2}' <<< "a,b,c"
b
$ awk -v FS=, '{print $2}' <<< "a,b,c"
b

但这个不会:
$ awk -F="" '{print $2}' <<< "abc"
                                      # $1 contains abc
$ awk -v FS="" '{print $2}' <<< "abc"
b

为什么?这是因为将FS设置为空只在gawk中有效吗?

2
你已经将它设置为= - 123
1
@User112638726 哦,没错!awk -F="" '{print $2}' <<< "ab=c"返回c - fedorqui
2个回答

5

看起来你可以这样做:

$ awk -F '' '{print $2}' <<< "abc"
b

在GNU awk(版本3.0.4和4.1.1)和mawk版本1.2上进行了测试。

需要明确的是,-F''之间的空格重要的


太棒了,这就对了!然后我注意到awk -F=","也不起作用,所以很可能是因为-F需要将参数“粘在一起”或在空格后面(POSIX方式?)。 - fedorqui
1
@fedorqui 简短选项(通常)不使用 =,因此 -F=","-F=, 相同,与 FS="=," 相同。 -F'' 之间的空格很重要,因为 -F'' 只变成了 -F,然后它仍然需要一个参数。 - Etan Reisner
@EtanReisner 很好!这是一个POSIX标准还是适用于任何情况? - fedorqui
2
POSIX 工具规范在这里,第 3 条指南说明选项是单个字符。第 6 条指南说明选项和参数应该用空格分隔。我没看到它涵盖长选项。我所知道的行为是一般 getopt 操作,但我不能自信地说更多。如果 rici 或 mklement0 看到这个,他们可能能够给出更具体的答案。 - Etan Reisner
1
这种情况发生的原因是 Bash 处理命令行的方式,而不是 Awk。当空字符串与变量相接时,Bash 会将其吞掉。我几个月前曾与 Bash 的维护者讨论过这个问题。这会影响所有命令行工具,包括 read。例如,while read -d '' a bwhile read -d'' a b 是不同的。 - user4401178

5
为什么?这是因为将FS设置为空只适用于gawk吗?需要注意的是,如果将空字符串赋值给FS,则标准规定结果未指定。某些版本的awk会产生您在示例中显示的输出。OS/X上的awk版本会发出警告并输出结果。
awk: field separator FS is empty

因此,在每个 awk 中,将 FS 设置为空字符串的特殊含义并不起作用。


1
不错!实际上我认为这是gawk特定的。 - fedorqui
2
@fedorqui 正确。我不知道mawk会怎么处理它,但nawk会报告一个警告(就像上面的一样),并使用默认的FS,而/usr/xpg4/bin/awk将把整个记录视为单个字段来处理。 - Ed Morton

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