2015-10-08 10 views
2

Я пытаюсь написать сценарий bash, который вычисляет среднее число чисел по строкам и столбцам. Пример текстового файла, который я читал в это:Как суммировать строку чисел из текстового файла - Bash Shell Scripting

1 2 3 4 5 
4 6 7 8 0 

Существует неизвестное количество строк и неизвестное число столбцов. В настоящее время я просто пытаюсь суммировать каждую строку с циклом while. Требуемый выход:

1 2 3 4 5 Sum = 15 
4 6 7 8 0 Sum = 25 

И так далее и так далее с каждым рядом. В настоящее время это код, который у меня есть:

while read i 
do 
    echo "num: $i" 
    ((sum=$sum+$i)) 
    echo "sum: $sum" 
done < $2 

Чтобы вызвать программу, это статистика -r test_file. «-r» указывает строки - я еще не начал столбцы. Мой текущий код фактически занимает первое число каждого столбца и добавляет их вместе, а затем остальные числа выходят за пределы синтаксической ошибки. В нем говорится, что ошибка исходит из 16, которая является строкой ((sum = $ sum + $ i)), но я, честно говоря, не могу понять, в чем проблема. Я должен сказать вам, что я чрезвычайно новичок в написании сценариев bash, и у меня есть поиск в googled и поиск высокого и низкого для ответа для этого и не могу найти его. Любая помощь приветствуется.

+0

Я думаю, что вы хотите, сумма = $ (($ сумма + $ я)) –

+0

ли 'awk' разрешено? – Jubobs

ответ

2

Вы читаете файл по строкам, а строка суммирования - это не арифметическая операция. Попробуйте следующее:

while read i 
do 
    sum=0 
    for num in $i 
    do 
    sum=$(($sum + $num)) 
    done 
    echo "$i Sum: $sum" 
done < $2 

просто разделите каждое число из каждой строки, используя для цикла. Надеюсь, это поможет.

+0

Вы можете упростить 'sum = $ (($ sum + $ num))' to '((sum = sum + num))'. – Jubobs

+0

или заменить 'sum = 0' на' declare -i sum = 0' и использовать 'sum + = $ num' с bash. – Cyrus

+0

Это работало именно так, как я этого хотел! Спасибо. – clb

0

Другой путь (не чистый bash):

while read line 
do 
    sum=$(sed 's/[ ]\+/+/g' <<< "$line" | bc -q) 
    echo "$line Sum = $sum" 
done < filename 
0

Другой способ не Баш (CON: OP попросил Баш, про: не зависит от bashisms, работает с поплавками).

awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print $0, "Sum:", c}'