奇怪的awk输出包含空格

时间:2018-05-23 21:23:12

标签: linux awk gawk

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

echo "hello world" | awk 'BEGIN{FS=""} {$1=toupper($1); printf "%s\n", $0}'

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

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

输出:

H e l l o   w o r l d

4 个答案:

答案 0 :(得分:2)

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

第一个字段/字符是大写字母。

您的第一种和第二种方法是等效的,因为print默认为print $0,而printf "%s\n", $0相当于print $0

答案 1 :(得分:0)

FS=""表示将每个字符视为单独的字段。 $0包含由OFS分隔的所有字段,即输出字段分隔符。 OFS默认为单个空格,因此每个字段用空格分隔。

如果您希望它输出没有额外空格的结果,请指定为OFS

echo "hello world" | awk 'BEGIN{FS=""; OFS=""} {$1=toupper($1); printf "%s\n", $0}'

答案 2 :(得分:0)

我相信FS=""可以在几个特定的​​问题上工作,所以试图提供一般解决方案,请你试试。

echo "hello world" |
awk '{$1=toupper(substr($1,1,1)) substr($1,2)} 1'

答案 3 :(得分:0)

额外空格的原因是你没有设置OFS

这是另一种解决方案

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

Hello world

或扩展您的解决方案

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

Hello world

不重写$0将保留原始格式。