Переменная и суммирование - PullRequest
0 голосов
/ 07 мая 2019

Я хотел бы понять разницу в результате для следующих команд awk.

Я прочитал, что когда awk вводит числовые переменные, они по умолчанию устанавливаются в ноль, поэтому предположим, что sum = 0 будетпредполагается неявно.

Однако 1) дает неверный результат, а 2) является правильным.

Цель: Найти общее количество строк в файле безиспользуя NR

financial.txt

14D 20190503 0.31 0.31 0.295 0.295 117949
14DO 20190503 0.00 0.00 0.00 0.07 0
1AD 20190503 0.18 0.19 0.18 0.19 54370
1AG 20190503 0.041 0.042 0.041 0.042 284890
1AL 20190503 0.00 0.00 0.00 0.88 0
1ST 20190503 0.05 0.05 0.049 0.049 223215
3DP 20190503 0.049 0.054 0.048 0.048 2056379
3PL 20190503 1.055 1.06 1.02 1.05 120685
4CE 20190503 0.00 0.00 0.00 0.009 0
4DS 20190503 0.072 0.076 0.072 0.075 2375896

$ awk 'BEGIN {sum+=1} END {print sum}' financial.txt

1

$ awk 'BEGIN {sum=0}{sum+=1} END {print sum}' financial.txt

5527

Спасибо


Изучив комментарии, я нашел решение, которое искал, не используя BEGIN.

$ awk '{sum+=1}END{print sum}' financial.txt
5527

Ответы [ 2 ]

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

С GNU AWK Руководство :

A BEGIN rule is executed once only, before the first input record is read. Likewise, an END rule is executed once only, after all the input is read.

Таким образом, следующее будет выполнять оператор "{sum + = 1}" только один раз.

awk 'BEGIN {sum+=1} END {print sum}' financial.txt

Ново втором случае "{sum + = 1}" выполняется для каждой строки, считанной из файла.

awk 'BEGIN {sum=0}{sum+=1} END {print sum}' financial.txt 
3 голосов
/ 07 мая 2019

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

BEGIN {sum+=1} END {print sum}

означает:

BEGIN {sum+=1}
END {print sum}

пока это:

BEGIN {sum=0}{sum+=1} END {print sum}

означает:

BEGIN {sum=0}
<true> {sum+=1}
END {print sum}

Видите разницу? Добавляйте ;print sum перед каждым }, чтобы отслеживать, как заполняется sum, если неясно, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...