Я вычисляю проценты каждого элемента в столбце файла, используя следующую команду 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"
в нескольких постах, касающихся одной и той же проблемы. Я что-то упускаю из виду?
Я очень ценю любую помощь или предложения!
Вы неправильно понимаете синтаксис 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
(вкладки входят в строку формата; %%
соответствует литералу %
т.е. предотвращает %
от того, чтобы быть интерпретируемым как запуск другого спецификатора формата).