除非由用户或用户脚本设置,否则 OFS 的值似乎始终是空格。即使输入使用制表符:
$ printf 'one\ntwo\tthree\nfour' | awk '{NF=NF}1' | sed -n l
one$
two three$
four$
然而,对于类似的变量 (ORS),有时会这样说:不要管 ORS,这样它就可以保留对您的平台应有的价值。我可以想象在某些平台上默认的 ORS 可能是\r\n
.在某些平台上这似乎是明智的。
OFS 面临的问题是:
- OFS 在平台之间会发生变化吗?
- 是否有一些 OFS 不是空格的实现?
编辑评论:对于我的问题可能产生的任何困惑,我深表歉意,我希望现在已经清楚了。
还不能投票。
答案1
正如我(现在)在那里评论的那样,ORS 始终默认为"\n"
,但在 Windows 上C实现(除了 awk 之外,它还适用于许多其他程序)\n
在 CR LF 和 CR LF 之间进行转换——对于所有\n
字符,无论它们是从 ORS 生成的,还是在输入时与 RS 匹配的。
相似地,是 OFS 始终默认为(一)个空格。 FS 也默认为 1 个空格,但经过特殊处理:当 FS 等于 1 个空格时,要么默认或者显式设置,字段实际上被任意分割空白序列(包括您发布的案例中的选项卡)。任何其他单字符 FS 都被视为文字字符,任何多字符值都被视为正则表达式。
因此,对于单空格或正则表达式的情况,记录可能会在分隔符处分割,这些分隔符因字段和/或记录而异,但如果您通过像您所做的那样分配给 NF 或任何字段来重建 $0,则重建的行在所有字段(如果超过一个)之间使用 OFS 的固定值。另外,如果您使用print x,y,z
多个表达式,它们将由(固定)OFS 分隔。当然,如果您显式打印或以其他方式使用包含 OFS(或由 OFS 组成)的字符串表达式,您将获得 OFS 的值。
标准 RS 可以设置为任何单个字符,或空字符串以导致“段落”模式,其中记录被一个或多个空行(连续的换行符)分割;在这种模式下,默认情况下它会分裂领域除了正常情况外,在换行符处。在GNU仅限 awk,RS 可以设置为多字符正则表达式,并且匹配结果在 RT 中可用。请参阅底部的摘要GNU 文档中的此页面。