Linux awk的默认字段分隔符
很抱歉这个愚蠢的问题,搜索过但没有把握找到了正确的答案,因此默认分隔符仅为awk的空格?让我们看看GNU awk手册页:Linux awk的默认字段分隔符,linux,unix,awk,posix,separator,Linux,Unix,Awk,Posix,Separator,很抱歉这个愚蠢的问题,搜索过但没有把握找到了正确的答案,因此默认分隔符仅为awk的空格?让我们看看GNU awk手册页: FS-输入字段分隔符,默认为空格。见上文字段 到田野区去 读取每个输入记录时,gawk使用FS变量的值作为字段分隔符,将记录拆分为字段。如果FS是单个字符,则字段由该字符分隔。如果FS为空字符串,则每个字符将成为一个单独的字段。否则,FS应该是一个完整的正则表达式。在FS是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。 问题默认分隔符仅为awk的空格?不明确,
FS
-输入字段分隔符,默认为空格。见上文字段
到田野区去
读取每个输入记录时,gawk使用FS
变量的值作为字段分隔符,将记录拆分为字段。如果FS
是单个字符,则字段由该字符分隔。如果FS
为空字符串,则每个字符将成为一个单独的字段。否则,FS
应该是一个完整的正则表达式。在FS
是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。
问题
默认分隔符仅为awk的空格?
不明确,但我将尝试回答您可能提出的两个问题
FS
变量的默认值(包含字段分隔符,告诉awk在读取记录时如何将记录分隔为字段)是一个空格字符
awk用于将记录分隔为字段的是“字段分隔符”,它是一个正则表达式,具有一些附加功能,仅当字段分隔符为单个空白字符时才适用。该附加功能是:
[]
,而不是像在regexp中那样仅指定一个独立的文本空白字符split()
的第三个参数,因此了解哪些上下文需要字符串、regexp或fieldsep非常重要,手册页清楚地指定了每个字段
除其他事项外,上述内容解释了这一点:
$ echo ' a b c ' | awk '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
3: <a> <b> <c>
$ echo ' a b c ' | awk -F' ' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
3: <a> <b> <c>
$ echo ' a b c ' | awk -F'[ ]' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
5: <> <a> <b>
$echo'abc'| awk'{printf“%d:\n”,NF,$1,$2,$3}
三:
$echo'abc'| awk-F'{printf“%d:\n”,NF$1,$2,$3}'
三:
$echo'abc'| awk-F'[]'{printf“%d:\n”,NF$1,$2,$3}'
5:
因此,如果您不理解为什么前两个产生相同的输出,但最后一个不同,请询问。这里有一个适用于所有主要Awk实现的实用总结:
- GNU Awk(
)-某些Linux发行版中的默认值gawk
Awk
- Mawk(
)-一些Linux发行版中默认的Mawk
(例如,Ubuntu的早期版本报告说,版本19.04现在带有GNU awk-见下面的评论。)awk
- BSD Awk-也称BWK Awk-类似BSD的平台(包括OSX)上的默认
Awk
awk-W版本将告诉您默认的awk
是哪个实现。
BSD Awk只理解Awk--version
(GNU Awk除了理解Awk-W version
)之外还了解该版本
所有这些实现的最新版本都遵循与字段分隔符相关的规则(但不包括记录分隔符)
词汇表:
RS
是输入记录分隔符,它描述了如何将输入分解为记录:
- POSIX强制默认值是一个换行符,下面也称为
\n
;也就是说,输入在默认情况下被分成几行
- 在
awk
的命令行上,RS
可以指定为-vrs=
- POSIX将
RS
限制为一个文本、单字符值,但GNU Awk和Mawk支持可以是扩展正则表达式的多字符值(BSD Awk不支持)
FS
是输入字段分隔符,它描述了如何将每条记录拆分为字段;它可能是一个扩展的正则表达式
- 在
awk
的命令行上,FS
可以指定为-F
(或-vfs=
)
- 形式上是一个空格(
0x20
),但该空格不是字面意义上的(唯一)分隔符,而是具有特殊含义;见下文
默认情况下:
- 任何空格和/或选项卡和/或换行符的运行都被视为字段分隔符
- 忽略了前导和尾随运行
POSIX规范,适用于所有语言环境,但可能包含特定语言环境中的其他字符-我不知道是否存在任何此类语言环境
请注意,使用默认输入记录分隔符(RS
),\n
,换行符通常不作为字段分隔符输入图片,因为在这种情况下,没有记录本身包含\n
新行作为字段分隔符确实起作用,但是:
- 当
RS
设置为一个值,该值导致记录本身包含\n
实例时(例如RS
设置为空字符串时;请参见下文)
- 通常,当使用
split()
函数将字符串拆分为数组元素时,没有显式的字段分隔符参数。
- 即使输入记录