Суммаризация строк в новом столбце с использованием SED, AWK и PERL?

Вы можете получить это без awk с помощью:

while read line; do echo $line; read a; read b; read c;  printf "%.7f %.7f\n %.7e\n %.7e\n" $a $b $c; done < data.txt

Однако использование printf таким способом может привести к некоторым проблемам, если вы используете какой-либо языковой стандарт, используя запятую вместо точки. В этом случае вы сможете исправить это с помощью:

while read line; do echo $line; read a; read b; read c; LC_NUMERIC="en_US.UTF-8" printf "%.7f %.7f\n %.7e\n %.7e\n" $a $b $c; done < data.txt

Конечно, в сценарии вам следует лучше отформатировать его с возвратом каретки и отступом.

5
19.09.2018, 18:08
4 ответа

Допустим, ваши данные сохранены в файле с именем data.txt.

cat data.txt
1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5

Вы можете сделать это в awkследующим образом:

awk '{X=$0}{split(X,x)}{print X, x[1]+x[2]+x[3]}' data.txt
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40

Или согласно комментарию @RudiC:

awk '{print $0, $1+$2+$3}' data.txt
4
27.01.2020, 20:32

Перл раствор:

perl -MList::Util=sum -lane 'print "@F ", sum(@F)' < data.txt
  • -nсчитывает ввод построчно
  • -lудаляет новые строки из ввода и добавляет их в вывод
  • -aразбивает каждую строку ввода по пробелу в массив @F
  • List ::Util предоставляет функцию sum, поэтому вам не нужно самостоятельно суммировать числа

В sed практически невозможно реализовать арифметику, но вы можете использовать sed для преобразования пробелов в плюсы и использовать их в качестве источника для bcполучения сумм и вставки результатов с входными данными:

paste -d ' ' data.txt <(sed -r 's/ /+/g' data.txt | bc)
8
27.01.2020, 20:32

Для произвольного числа столбцов с помощьюawk:

$ awk '{ sum = 0; for (i = 1; i <= NF; i++) sum += $i; $(NF + 1) = sum } 1' <file
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40

NF— количество полей (разделенных пробелами столбцов по умолчанию )в текущей записи (строки по умолчанию ). Вычисляя sumв цикле и присваивая $(NF + 1)итогу, мы добавляем новый столбец в конце. Этот новый столбец печатается вместе с другими единственным 1в конце сценария awk(, который можно заменить на{ print }).


sedна самом деле не подходит для выполнения каких-либо арифметических операций.

4
27.01.2020, 20:32

Как насчет чистого решения bash?

while read -r a b c; do
    echo $a $b $c $((a+b+c))
done < input

Пробный запуск

0
27.01.2020, 20:32

Теги

Похожие вопросы