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

fed*_*qui 3 awk gawk

在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
Run Code Online (Sandbox Code Playgroud)

但这不是:

$ awk -F="" '{print $2}' <<< "abc"
                                      # $1 contains abc
$ awk -v FS="" '{print $2}' <<< "abc"
b
Run Code Online (Sandbox Code Playgroud)

为什么?这是因为设置FS为空是gawk特定的吗?

Tom*_*ech 6

看起来你可以这样做:

$ awk -F '' '{print $2}' <<< "abc"
b
Run Code Online (Sandbox Code Playgroud)

在 GNU awk(版本 3.0.4 和 4.1.1)和 mawk 版本 1.2 上测试

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

  • 实用程序的 POSIX 规范位于[此处](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html)。准则 3 规定选项是单个字符。准则 6 规定选项和参数应该用空格分隔。它根本不涵盖我所看到的长选项。据我所知,上面的行为是一般的 getopt 操作,但我不能自信地说更多。如果 rici 或 mklement0 看到这一点,他们可能能够给出更具体的答案。 (2认同)

Aks*_*gde 5

为什么?这是因为将FS设置为空是特定的gawk吗?

请注意,标准表示如果分配了空字符串,则结果未指定FS.某些版本awk将生成您在示例中显示的输出.awkon 版本OS/X发出警告和输出.

awk: field separator FS is empty
Run Code Online (Sandbox Code Playgroud)

因此设置FS为空字符串的特殊含义并不适用于每一个字符串awk.

  • @fedorqui正确.idk mawk会用它做什么,但是nawk会报告一个警告(如上所述)并使用默认FS,而/ usr/xpg4/bin/awk会将其视为整个记录是单个字段. (2认同)