AWK как посчитать сумму

AWK как посчитать сумму

Входной файл (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

Проблема с вашим кодом двоякая:

  1. На самом деле он не использует awkтак, как это обычно делается. Он явно циклически проходит по строкам файла в BEGINблоке. Это не идиоматический способ, которым обычно пишут awkпрограммы, который заключается в предоставлении (необязательных) шаблонов или условий для блоков, которые должны быть выполнены для каждой входной записи (строки).
  2. Поскольку входные данные состоят из записей (по умолчанию отдельных строк) с более чем одним числом, вам придется обрабатывать эти записи таким образом, чтобы отдельные числа суммировались. Другими словами, вы не можете добавить к 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'

Связанный контент