Странный вывод awk содержит пробелы - PullRequest
0 голосов
/ 24 мая 2018

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

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 голосов
/ 24 мая 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 сохранит исходный формат.

0 голосов
/ 24 мая 2018

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

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

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

0 голосов
/ 24 мая 2018

Я полагаю, что FS="" может работать с несколькими конкретными ауками, поэтому, пытаясь найти общее решение, не могли бы вы попробовать.

echo "hello world" |
awk '{$1=toupper(substr($1,1,1)) substr($1,2)} 1'
0 голосов
/ 24 мая 2018

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

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

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