很抱歉,这个愚蠢的问题已被搜索,但不确定是否找到了正确的答案,因此默认分隔符仅是awk的空间?
这是适用于 所有主要Awk实现* 的 实用摘要 : *
gawk
awk
mawk
在Linux上,awk -W version将告诉您默认的实现awk。 BSD awk中 仅 理解awk --version(其GNU awk中理解 除了 对awk -W version)。
awk -W version
awk --version
所有 这些实现的最新版本 均 遵循POSIX标准,涉及 字段 分隔符[1](但不包含 记录 分隔符)。
词汇表:
RS 是 输入 记录 分隔符,它描述 如何将输入分解为 记录 :
RS
\n
-v RS=<sep>
FS 是 输入 字段 分隔符,它描述如何将 每个记录 拆分为多个 字段 ;它可能是 扩展的正则表达式 。
FS
在awk的命令行上,FS可以指定为-F <sep>(或-v FS=<sep>)。
-F <sep>
-v FS=<sep>
0x20
默认情况下 :
POSIX规范。对空格和制表符使用抽象<blank>,这对于 所有 语言环境都是正确的,但是 可以 在特定语言环境中包含 其他 字符-我不知道是否存在任何此类语言环境。
<blank>
请注意, 使用默认的输入记录分隔符 (RS)时\n, 换行符 通常 不将图片输入为字段分隔符,因为在这种情况下, 记录 本身不 包含\n在内。
换行符作为字段分隔符 确实 起作用,但是:
split()
-v
重要的非默认注意事项 :
分配 空 字符串RS具有特殊的意义:它读取输入 段落模式 ,这意味着输入被分成记录 的运行 非空行 ,用 开头和结尾的忽略空行运行 。
当你 指定的任何 其他 不是 字面 空间FS,该 解释FS 的变化从根本上 :
[ ]
+
[\t]+
[1]不幸的是,当您使用该选项强制执行POSIX合规性()时,GNU Awk至少版本4.1.3符合关于字段分隔符的 过时 POSIX标准,-P(--posix):该选项有效且RS设置 为非空 值,换行符(\n实例)不识别为字段分隔符。GNU Awk手册阐明了过时的行为(但是忽略了将其RS设置为 空 字符串时不适用的行为)。POSIX标准在2008年进行了更改(请参阅注释),以在具有默认值时 也 考虑 换行符 字段分隔符FS-因为GNU Awk始终 不使用 -P(--posix)。 以下是验证上述行为2个命令: 使用-P在效果和RS设置到 空字符串 ,\n则 仍 视为字段分隔符: gawk -P -F' ' -v RS='' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb' 使用-P在效果和 非空 RS,\n不被视为一个字段分隔符-这是过时的行为:根据GNU Awk的维护者的说法, gawk -P -F' ' -v RS='|' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb' 修复程序即将到来 ;期望在 4.2 版中使用(未提供时间范围)。 (向@JohnKugelman和@EdMorton表示帮助)。
-P
--posix
gawk -P -F' ' -v RS='' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'
gawk -P -F' ' -v RS='|' '{ printf "<%s>, <%s>\n", $1, $2 }' <<< $'a\nb'