
Входной файл (FileInput.txt):
10 20 3 100 5 3 27
это мой скрипт awk:
BEGIN{ while((getline line < "FileInput.txt") > 0) {
}
как мне посчитать сумму? Я пробовал, sum+=line
но она суммирует только первый столбец.
решение1
Что-то вроде этого может выполнить эту работу:
awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt
решение2
Проблема с вашим кодом двоякая:
- На самом деле он не использует
awk
так, как это обычно делается. Он явно циклически проходит по строкам файла вBEGIN
блоке. Это не идиоматический способ, которым обычно пишутawk
программы, который заключается в предоставлении (необязательных) шаблонов или условий для блоков, которые должны быть выполнены для каждой входной записи (строки). - Поскольку входные данные состоят из записей (по умолчанию отдельных строк) с более чем одним числом, вам придется обрабатывать эти записи таким образом, чтобы отдельные числа суммировались. Другими словами, вы не можете добавить к
20 3
,sum
но должны будете сначала разделить это на20
и3
.
С помощью GNU awk
или mawk
мы можем задать разделитель записей, RS
, как регулярное выражение, которое соответствует любой последовательности пробельных символов вместо стандартного символа новой строки. Это заставит awk
файл читаться как набор записей отдельных полей, разделенных пробелами. Затем их суммирование и вывод суммы в конце тривиальны:
$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168
В качестве альтернативы,
$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168
Или вы можете сделать какой-нибудь вариант начто показывает Ромео Нинов, который заключается в циклическом переборе полей каждой строки,
$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168
решение3
Вы можете преобразовать свой файл так, чтобы в каждой строке было по одному числу:
tr -s '[:blank:]' '\n' < FileInput.txt
Затем выберите решение изhttps://stackoverflow.com/q/2702564/7552суммировать их. Например
tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'