July 2022 mac os Monterey V12.1
awk --version 20200816
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)
为什么awk -F
对大多数字母有效,但对字母无效t
?我有解决方案,但我想了解为什么 awk 对 letter 失败t
。
# Count 'e's
% echo "tweeter" | awk -F "e" '{print NF-1}'
3
# Count 'r's
% echo "tweeter" | awk -F "r" '{print NF-1}'
1
# (Attempt to) count 't's
% echo "tweeter" | awk -F "t" '{print NF-1}'
0 <=== ????
# Use gsub()
% echo "tweeter" | awk '{print gsub(/t/, "")}'
2
因为:
这来自FreeBSD awk 手册页,macOS 附带的实用程序通常是一些旧的 FreeBSD 版本等。
在某种程度上,对于具有制表符分隔值的文件来说,这似乎是一种有用的简写,但是对于其他字母按原样使用的情况,它会令人困惑。它只适用于
-F
,使用-v FS=t
不这样做。该功能是非 POSIX 的,正如POSIX 所说,
-F x
它与-v FS=x
. 我测试的大多数其他 awk 都被t
视为文字字母(gawk、mawk 和 Busybox 的某些版本)。不过,Debian 在
original-awk
软件包中的 awk 版本(“One True AWK”或“BWK awk”大概来自 Brian W. Kernighan 的首字母)确实支持它,至少Wikipedia 似乎表明这将是相同的软件 FreeBSD用途。这似乎是基于 1988 年的书“AWK 编程语言”中描述的版本,但我不是 awk 谱系方面的专家,不知道从那时起它是否有显着发展。那个在 github 上,但是那里的文档似乎没有描述该功能。可以在代码中看到特殊情况(在注释中将其描述为“疣”)。不过,您可以在 BWK-awk 兼容模式下使用 GNU awk 获得相同的行为。:
无论外壳/环境组合如何,绝对最安全的方法是使用方笼和双反斜杠作为选项卡
\\
即使它在单引号内加倍,如果任何环境变得太聪明并尝试剥离其中一个,它awk
仍然会作为制表符本身的基础字节。如果你真的很偏执,那就去做