Perl или AWK: нулевое разделение с Perl или AWK - PullRequest
1 голос
/ 09 мая 2019

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

BI,1266,908
BIL,494,414
BKC,597,380
BOOM,2638,654
BRER,1453,1525
BRIG,1080,763
DCLE,0,775

Выходные данные должны быть:

BI,1266,908,-28.3%
BIL,494,414,-16.2%
BKC,597,380,-36.35%
BOOM,2638,654,-75.2%
BRER,1453,1525,5%
BRIG,1080,763,-29.4%
DCLE,0,775,-

Обратите внимание на ноль впоследний рядЛюбое из этих полей может быть нулевым.Если в каком-либо поле присутствует ноль, N / A или - приемлемо.

То, что я пытаюсь -

Perl:

perl -F, -ane 'if ($F[2] > 0 || $F[3] > 0){print $F[0],",",$F[1],",",$F[2],100*($F[2]/$F[3])}' file

Я получаю Illegal division by zero at -e line 1, <> line 2. Если я изменю || на &&, он ничего не печатает.

В awk:

awk '$2>0{$4=sprintf("%d(%.2f%)", $3, ($3/$2)*100)}1' file

Просто печатает файл.

Ответы [ 3 ]

3 голосов
/ 09 мая 2019
$ awk -F, '$2 == 0 || $3 == 0 { printf("%s,-\n", $0); next }
           { printf("%s,%.2f%%\n", $0, 100 * ($3 / $2) - 100) }' input.csv
BI,1266,908,-28.28%
BIL,494,414,-16.19%
BKC,597,380,-36.35%
BOOM,2638,654,-75.21%
BRER,1453,1525,4.96%
BRIG,1080,763,-29.35%
DCLE,0,775,-

Как это работает: если второй или третий столбцы равны 0, добавьте поле - в строку. В противном случае рассчитайте процентную разницу и добавьте ее.

3 голосов
/ 09 мая 2019

Основная проблема вашего perl заключалась в путанице индексов столбцов в 1 в awk с индексами столбцов в 0 в perl.

 perl -F, -ane 'print "$1," if /(.+)/;if ($F[1] > 0 && $F[2] > 0){printf ("%.2f%", ((100*$F[2]/$F[1])-100)) } else {print "-"};print "\n"' file

$1 здесь относится к группе захвата (.+), что означает «Вся строка, кроме перевода строки».Остальное, вероятно, говорит само за себя, если вы понимаете awk.

2 голосов
/ 09 мая 2019

Вы не говорите awk, что поля разделены запятыми, поэтому предполагается, что значение по умолчанию, пробелы и т. Д. $ 2 никогда не бывает больше нуля, поскольку оно равно нулю, поскольку в каждой строке есть только 1 поле, разделенное пробелами.Измените его на:

$ awk 'BEGIN{FS=OFS=","} $2>0{$4=sprintf("%d(%.2f%)", $3, ($3/$2)*100)}1' file
BI,1266,908,908(71.72%)
BIL,494,414,414(83.81%)
BKC,597,380,380(63.65%)
BOOM,2638,654,654(24.79%)
BRER,1453,1525,1525(104.96%)
BRIG,1080,763,763(70.65%)
DCLE,0,775

, а затем настройте его для желаемого результата:

$ awk 'BEGIN{FS=OFS=","} {$4=($2 && $3 ? sprintf("%.2f%", (($3/$2)-1)*100) : "N/A")} 1' file
BI,1266,908,-28.28%
BIL,494,414,-16.19%
BKC,597,380,-36.35%
BOOM,2638,654,-75.21%
BRER,1453,1525,4.96%
BRIG,1080,763,-29.35%
DCLE,0,775,N/A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...