awk - округлить до 2 десятичных знаков

Я вычисляю проценты каждого элемента в столбце файла, используя следующую команду awk:

awk '{a[NR]=$2;x+=(b[NR]=$2);c[NR]=$1}END{while(++i<=NR)print c[i]"\t"a[i]"\t"100*b[i]/x"%"}' file.txt > out_file.txt

file.txt

N    38668442   
V    14008521   
ADJ  16112215   

out_file.txt

N    38668442   56,213%
V    14008521   20,3644%
ADJ  16112215   23,4226%

Однако я бы хотел, чтобы проценты в out_file.txt были округлены до 2 десятичных знаков.

требуемый out_file.txt

N    38668442   56,21%
V    14008521   20,37%
ADJ  16112215   23,42%

Ссылка на этот пост: https://stackoverflow.com/questions/18696096/awk-calculate-sum-of-2nd-column-and- cent-wrt-sum-and-print

Я попытался интегрировать printf "%s,%d,%0.2f%\n в мой код, который вызывает ошибку аргумента, даже уменьшая аргументы, и ограничивая выражение до %0.2f%\n.

 awk '{a[NR]=$2;x+=(b[NR]=$2);c[NR]=$1}END{while(++i<=NR)printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"}' file.txt > out_file.txt

Также bc не сработало. Почему он не дает желаемого результата? На мой взгляд, это должно сработать, поскольку я нашел выражение printf "%0.2f\n" в нескольких постах, касающихся одной и той же проблемы. Я что-то упускаю из виду?

Я очень ценю любую помощь или предложения!

4
задан 23 May 2017 в 15:39

1 ответ

Вы неправильно понимаете синтаксис printf команда (который тесно следует за тем из базовых C функция: посмотрите, например, man 3 printf для полной документации).

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

printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"

Вы говорите этому ожидать 3 значения (a %s, a %d, и a %0.2f) но дают ему сингл, связанный, аргумент строки c[i]"\t"a[i]"\t"100*b[i]/x"%". Следовательно это исчерпает аргументы во время присвоения.

То, что Вы, по-видимому, предназначили,

printf "%s\t%d\t%0.2f%%\n", c[i], a[i], 100*b[i]/x

(вкладки входят в строку формата; %% соответствует литералу % т.е. предотвращает % от того, чтобы быть интерпретируемым как запуск другого спецификатора формата).

7
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: