Странный вывод awk содержит пробелы

Почему у меня появляются эти странные пробелы?

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

person tenjohn    schedule 23.05.2018    source источник
comment
Не ответ на вопрос, но немного связанный: sed/awk заглавные строки   -  person kvantour    schedule 24.05.2018


Ответы (3)


Установка разделителя полей на пустую строку имеет особое значение: она считывает каждый символ в отдельное поле. Поскольку разделитель выходных полей OFS не изменился (пробел), ваше задание перетасовывает всю запись и вставляет OFS между каждым отдельным полем.

Первое поле/символ в верхнем регистре.

Ваш первый и второй методы эквивалентны, потому что print по умолчанию равно print $0, а printf "%s\n", $0 эквивалентно print $0.

person Benjamin W.    schedule 23.05.2018

FS="" означает рассматривать каждый символ как отдельное поле. $0 содержит все поля, разделенные OFS, разделителем выходных полей. OFS по умолчанию используется один пробел, поэтому каждое поле отделяется пробелом.

Если вы хотите, чтобы он выводил результат без лишнего пробела, назначьте OFS

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

причина лишних пробелов в том, что вы не установили 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, сохранится исходный формат.

person karakfa    schedule 24.05.2018