Как распечатать несколько столбцов с помощью awk '{printf...? С awk '{print... это легко:

$ printf bar\\t5 | awk '{print $2,"baz",$1}'
5 baz bar

Но если я хочу отформатировать цифру, чтобы показать определенное количество десятичных знаков, другие столбцы исчезнут:

$ printf bar\\t5 | awk '{printf "%.3f\n", $2,"baz",$1}'
5.000

Я попытался поместить оператор printf перед каждым столбцом, который я хотел отформатировать, но это привело к синтаксической ошибке:

$ printf bar\\t5 | awk '{printf "%.3f\n",$2, printf "%4s\n","baz", $1}'
awk: cmd. line:1: {printf "%.3f\n",$2, printf "%s\n","baz", $1}
awk: cmd. line:1:                      ^ syntax error

Или без printf и только строки формата перед каждым столбцом:

$ printf bar\\t5 | awk '{printf "%.3f\n",$2,"%4s\n","baz", $1}'
5.000

Как сделать так, чтобы все столбцы отображались при использовании awk '{printf...?

0
enharmonic 16 Апр 2021 в 02:10
Скопируйте/вставьте свой сценарий оболочки в shellcheck.net и исправьте проблемы, о которых он сообщает, а затем опубликуйте обновленный сценарий. Также добавьте ожидаемый результат.
 – 
Ed Morton
16 Апр 2021 в 17:17

2 ответа

Лучший ответ

Вы не предоставили ожидаемый результат, но похоже, что это может быть то, что вы пытаетесь сделать, т. е. указать формат для 1 поля вывода, но использовать форматирование по умолчанию для многих других, которые возникают, не перечисляя формат для всех полей в строка форматирования printf:

$ printf 'bar\t5\n' | awk '{print sprintf("%.3f",$2),"baz",$1}'
5.000 baz bar

Или же:

$ printf 'bar\t5\n' | awk '{$3=$1; $1=sprintf("%.3f",$2); $2="baz"} 1'
5.000 baz bar
1
Ed Morton 16 Апр 2021 в 17:23

Команда printf требует, чтобы все строки формата шли первыми, по одному % на выходной столбец, а затем вы можете ссылаться на столбцы из ввода, по одному , на столбец:

$ printf bar\\t5 | awk '{printf "%.3f,%4s|%s\n", $2,"baz",$1}'
5.000, baz|bar

Вам нужно точно такое же количество выходных столбцов, на которые нужно ссылаться в строке формата, поскольку есть входные столбцы после строки формата, иначе вы получите ошибку (в этом примере выходной формат имеет три столбца, а есть только два входных). столбцы):

$printf bar\\t5 | awk '{printf "%.3f,%4s|%s\n", $2,"baz"}'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: not enough arguments to satisfy format string
        `%.3f,%4s|%s
'
                  ^ ran out for this one

Разделители в строке формата являются буквальными, а запятые используются после строки формата для разграничения входных столбцов.

1
enharmonic 16 Апр 2021 в 02:01