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

Awk 如何将字段分隔符设置为空字符串?,awk,gawk,Awk,Gawk,awk手册指出-v FS和-F都是设置字段分隔符的等效方法 : 可以在命令行上设置FS。您可以使用“-F”参数来执行此操作 (……) “-F”的参数所用的值是以完全相同的方式处理的 与内置变量FS的赋值方式相同 但是,我注意到,如果我们将其设置为空字符串,则会有所不同,这是不同的。在myGNU Awk 4.1.1上测试 这项工作: $ awk -F, '{print $2}' <<< "a,b,c" b $ awk -v FS=, '{print $2}' <<&l

awk手册指出
-v FS
-F
都是设置字段分隔符的等效方法

:

可以在命令行上设置FS。您可以使用“-F”参数来执行此操作

(……)

“-F”的参数所用的值是以完全相同的方式处理的 与内置变量FS的赋值方式相同

但是,我注意到,如果我们将其设置为空字符串,则会有所不同,这是不同的。在my
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}”看起来您可以这样做:

$ awk -F '' '{print $2}' <<< "abc"
b
$awk-F''{print$2}'
为什么??这是因为将FS设置为空是特定于gawk的吗

请注意,标准规定,如果将空字符串分配给
FS
,则结果未指定。一些版本的
awk
将产生您在示例中上面显示的输出。
OS/X
上的
awk
版本发出警告并输出

awk: field separator FS is empty

因此,将
FS
设置为空字符串的特殊含义并不能在每个
awk
中都起作用,这很酷!然后我注意到
awk-F=“,”
也不起作用,所以这可能是因为
-F
需要将参数指定为“粘合”或在空格后(POSIX方式?)@fedorqui Short options(通常)不使用
=
所以
-F=“,”
-F=,
相同,后者与
相同。
-F
'
之间的空格很重要,因为
-F'
只是变成了
-F
,然后它还需要一个参数。@EtanReisner nice!这是POSIX标准还是适用于任何类型的情况?POSIX实用程序规范是。准则3说选项是单个字符。准则6说选项和参数应该用空格隔开。它根本不包括我能看到的长选项。就我所知,上面的行为是一般的getopt操作,但我不能自信地说得更多。如果rici或mklement0看到这一点,他们可能会给出更具体的答案。发生这种情况的原因是Bash处理命令行的方式,而不是Awk。当Bash被压在一个变量上时,它会吃掉一个空字符串,几个月前我和Bash维护人员谈过这一点。这会影响所有命令行实用程序,包括
read
。例如,读取-d“a b时的
与读取-d”a b时的
不同。您已将其设置为
=
@User112638726哦,是的<代码>awk-F=“{print$2}”很好!事实上,我认为它是
gawk
特定的。@fedorqui正确。idk知道mawk会如何处理它,但是nawk会报告一个警告(如上所述)并使用默认的FS,而/usr/xpg4/bin/awk会将其视为整个记录是一个字段。
awk: field separator FS is empty