很抱歉这个愚蠢的问题,已搜索但不确定是否找到了正确的答案,因此默认分隔符仅是awk的空格?
这里是一个实用摘要,适用于所有主要的Awk实现:
gawk
)-some Linux发行版中的默认awk
mawk
)-some Linux发行版中的默认awk
(例如,Ubuntu的早期版本crysman报告说19.04版本现在随GNU一起提供) Awk-请在下面查看他的评论。)awk
在Linux上,awk -W version
会告诉您默认的awk
是哪种实现。BSD Awk only
awk --version
(GNU Awk理解[awk -W version
的另外)。all
的最新版本,相对于field分隔符 [1]](但不是[[record分隔符),这些实现遵循POSIX standard。词汇表:[RS
是input-record
\n
;也就是说,输入默认情况下被分解为行。在awk
的命令行上,可以将RS
指定为-v RS=<sep>
。RS
限制为[FS
awk
的命令行上,可以将FS
指定为-F <sep>
(或-v FS=<sep>
)。0x20
),但该空间不是literally解释为(仅)分隔符,而是具有特殊含义;参见下文。默认情况下>>:
和/或 制表符和/或换行符>]被视为字段分隔符
<blank>
for spaces and tabs,对于all
语言环境来说是正确的,但是could在特定语言环境中包含additional个字符-我不知道是否存在任何这样的语言环境。<blank>
),RS
,换行符通常]不将图片作为字段分隔符输入,因为没有记录包含\n
当\n
设置为导致包含RS
实例的记录本身
的值(例如,当\n
设置为
RS
函数将字符串拆分为没有显式字段分隔符参数的数组元素时。split()
有效的情况下也不会包含\n
实例,但是如果在[[multi-来自其他来源的行字符串(例如,通过RS
选项传递的变量或作为伪文件名)split()
视为字段分隔符。将empty
-v
具有特殊含义:它以paragraph mode
\n
时,RS
的解释从根本上改变:A 单个
字符或指定字符setFS
设置为FS
-即使FS
;例如[ ]
会将标签的运行识别为单个分隔符。+
设置为空字符串] >>表示记录的[\t]+
,如果将FS
设置为空字符串RS
的值无关。[[1]不幸的是,当您使用强制执行POSIX的选项时,对于字段分隔符,至少达到4.1.3版的GNU Awk符合过时 POSIX标准。 ]):启用该选项并将\n
设置为FS
实例)将不被识别为字段分隔符。 GNU Awk手册说明了过时的行为(但忽略了提及,当-P
设置为empty--posix
具有默认值时,考虑[RS
([C0 ])。这是验证上述行为的2条命令:*在\n
有效且RS
设置为空字符串的情况下,FS
被still视为字段分隔符:-P
*启用--posix
且非空 -P
时,RS
不被视为字段分隔符-这是过时的行为:\n
根据GNU Awk的维护者的说法,gawk -P -F' ' -v RS='' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'
问题不明确,但我会尝试回答您可能要问的两个问题。-P
变量的默认值(保留字段分隔符,该分隔符告诉awk在读取记录时将记录分成多个字段)是单个空格字符。awk用于将记录分成字段的东西是“字段分隔符”,它是带有某些附加功能的正则表达式,仅在字段分隔符为单个空白字符时才适用。该附加功能是:在拆分字段时,前后空格都将被忽略。字段由连续的空格字符分隔,包括空白,制表符和换行符。如果要使用文字空白字符作为字段分隔符,则必须将其指定为RS
,而不能像在正则表达式中那样仅使用独立的文字空白char。除了在读取输入时将字段分隔符用于将记录分为多个字段外,它们还用于其他一些上下文中,例如\n
的第三个参数,因此,重要的是要知道哪些上下文需要字符串或regexp或fieldsep,并且手册页中明确指定了每个上下文。此外,以上内容对此进行了解释:
gawk -P -F' ' -v RS='|' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'
让我们看一下GNU awk手册页:
the default delimiter is only space for awk?
—输入字段分隔符,默认为空格。请参阅上方的[[Fields。
FS
变量的值作为字段分隔符,将记录分成多个字段。如果[ ]
是单个字符,则字段由该字符分隔。如果split()
为空字符串,则每个单独的字符将成为一个单独的字段。否则,$ 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>
应该是完整的正则表达式。在FS
是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。
让我们来看看GNU AWK手册页:
FS
- 输入字段分隔符,默认情况下的空间。见田,上面。
到田间地头节!
由于每个输入记录被读取,GAWK拆分成几个域,使用
FS
变量作为字段分隔符的值。如果FS
是单个字符,字段是由字符分隔。如果FS
是空字符串,然后每个人性格变得独立的领域。否则,FS
有望成为一个完整的正则表达式。在FS
是一个单一的空间中的特殊情况下,字段由空格运行和/或突出部和/或换行符分隔。