奇怪的 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=]
将保留原始格式。
为什么我会得到那些奇怪的空格?
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=]
将保留原始格式。