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