奇怪的 awk 输出包含空格

Weird awk output contains spaces

为什么我会得到那些奇怪的空格?

echo "hello world" | awk 'BEGIN{FS=""} {=toupper(); printf "%s\n", [=10=]}'

我用更简单的方法得到了相同的结果。

echo "hello world" | awk 'BEGIN{FS=""} {=toupper(); print}'

输出:

H e l l o   w o r l d

FS=""表示将每个字符作为一个单独的字段。 [=12=] 包含由 OFS 分隔的所有字段,输出字段分隔符。 OFS 默认为单个 space,因此每个字段由 space 分隔。

如果你想让它输出没有额外space的结果,分配给OFS

echo "hello world" | awk 'BEGIN{FS=""; OFS=""} {=toupper(); printf "%s\n", [=10=]}'

将字段分隔符设置为空字符串具有特殊意义:它将每个单个字符读取到一个单独的字段中。由于输出字段分隔符 OFS 未更改(空白),因此您的分配会重新排列完整记录并在每个字段之间插入 OFS

第一个 field/character 是大写的。

你的第一个和第二个方法是等价的,因为 print 默认为 print [=13=],而 printf "%s\n", [=14=] 等价于 print [=13=]

多余空格的原因是你没有设置OFS.

这是另一个解决方案

$ echo "hello world" | awk '{sub(/^./,toupper(substr(,1,1)))}1' 

Hello world

或扩展您的解决方案

$ echo "hello world" | awk 'BEGIN{FS=""} {sub(,toupper())}1'

Hello world

不重写 [=13=] 将保留原始格式。