Вы можете получить это без 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
Конечно, в сценарии вам следует лучше отформатировать его с возвратом каретки и отступом.
Допустим, ваши данные сохранены в файле с именем 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
Перл раствор:
perl -MList::Util=sum -lane 'print "@F ", sum(@F)' < data.txt
-n
считывает ввод построчно -l
удаляет новые строки из ввода и добавляет их в вывод -a
разбивает каждую строку ввода по пробелу в массив @F sum
, поэтому вам не нужно самостоятельно суммировать числа В sed практически невозможно реализовать арифметику, но вы можете использовать sed для преобразования пробелов в плюсы и использовать их в качестве источника для bc
получения сумм и вставки результатов с входными данными:
paste -d ' ' data.txt <(sed -r 's/ /+/g' data.txt | bc)
Для произвольного числа столбцов с помощью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
на самом деле не подходит для выполнения каких-либо арифметических операций.
Как насчет чистого решения bash?
while read -r a b c; do
echo $a $b $c $((a+b+c))
done < input