2015-07-30 4 views
0

Скажем, у меня есть переменная, как это: list='1 1 1.4 1 1 1' оболочка: добавление из строк в строке

Теперь я хочу, прежде чем добавить значение из каждой строки на значение из строки. Например: result='1 2 3.4 4.4 5.4' Он также должен работать с плавающими номерами, поэтому я думаю, что awk - лучший инструмент для него.

я о том, с петлей в то время:

while read line; do 
    add=$(awk 'BEGIN{ print "'"$x"'" + "'"$line"'" }') 
done <<< "$list" 

Но это не работает, потому что я не знаю, как сохранить значение от линии раньше.

+0

Что вы пытались уже, что вы в конечном итоге с просьбой о помощи? Где ваш код не работает? – GHajba

+0

Я писал с петлей while: ' во время чтения строки; do add = $ (awk 'BEGIN {print "'" $ x "'"}') done <<< "$ list" ' Но это не работает, потому что я не знаю, как сохранить значение из строки. –

ответ

0

Это будет мой bash сниппет:

prev=0 
for val in $list; do 
    val=$(echo "$val + $prev"|bc) 
    prev=$val 
    result="${result}${val}\n" 
done 
echo -e "$result" 
0

Я не знаю, с использованием zsh (который поддержка плавающей точкой) является вариантом, но если это так, вы можете просто сделать:

s=0;for i in $list; do s=$(($s+$i)); echo $s; done 
+0

Конечно, вы также можете заменить '' $ (($ s + $ i)) '' на awk ... –

+0

Спасибо, я попробовал этот пример, но использовал awk для вычисления. Это выглядит хорошо, но после операции у меня больше нет чисел с плавающей запятой. –

+0

Можете ли вы показать точный код, который вы использовали? –

0

Вот способ сделать это с помощью bc:

#!/bin/bash 
list='1 
1 
1.4 
1 
1 
1' 

results=() 
total="0.0" 
index=0 
for line in $list; do 
    total=$(bc -l <<< "$line + $total") 
    echo $total 
    results[$index]=$total 
    let index++ 
done 

echo ${results[@]} 

также:

total="0.0"; while read v; do total=$(bc -l <<< "$v + $total"); echo $total; done <<< "$list" 
+0

Я попробовал это, но с этим я получаю только общее количество всех чисел. –

+0

Извините, я забыл промежуточное хранилище результатов, что теперь? – higuaro

0

Использование AWK вы можете сделать:

awk 'NR==1{print; s=$1; next} {s+=$1; print s}' file 
1 
2 
3.4 
4.4 
5.4 
6.4