如何对文本文件中的一行数字求和-- Bash Shell 脚本
How to sum a row of numbers from text file-- Bash Shell Scripting
我正在尝试编写一个 bash 脚本来按行和列计算数字的平均值。我正在阅读的文本文件示例是:
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 <
调用程序是 stats -r test_file。 “-r”表示行——我还没有开始列。我当前的代码实际上只是获取每列的第一个数字并将它们加在一起,然后其余数字作为语法错误出错。它说错误来自 16,这是 (( sum=$sum+$i )) 行,但老实说我无法弄清楚问题是什么。我应该告诉你,我对 bash 脚本编写非常陌生,我用谷歌搜索并在高处和低处搜索了这个问题的答案,但找不到。任何帮助是极大的赞赏。
您正在逐行读取文件,求和行不是算术运算。试试这个:
while read i
do
sum=0
for num in $i
do
sum=$(($sum + $num))
done
echo "$i Sum: $sum"
done <
只需使用 for 循环从每一行拆分每个数字。希望对您有所帮助。
另一种方式(不是纯粹的bash
):
while read line
do
sum=$(sed 's/[ ]\+/+/g' <<< "$line" | bc -q)
echo "$line Sum = $sum"
done < filename
另一种非 bash 方式(反对:OP 要求 bash,赞成:不依赖于 bashisms,使用浮点数)。
awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print [=10=], "Sum:", c}'
使用 numsum -r
util 覆盖行添加,但输出格式需要一点胶水,通过低效的 paste
-ing 一些实用程序:
paste "" \
<(yes "Sum =" | head -$(wc -l < "") ) \
<(numsum -r "")
输出:
1 2 3 4 5 Sum = 15
4 6 7 8 0 Sum = 25
注意 -- 对于给定文件 foo 上的 运行 行,首先像这样初始化 </code>:</p>
<pre><code>set -- "" foo
paste "" <(yes "Sum =" | head -$(wc -l < "") ) <(numsum -r "")
我正在尝试编写一个 bash 脚本来按行和列计算数字的平均值。我正在阅读的文本文件示例是:
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 <
调用程序是 stats -r test_file。 “-r”表示行——我还没有开始列。我当前的代码实际上只是获取每列的第一个数字并将它们加在一起,然后其余数字作为语法错误出错。它说错误来自 16,这是 (( sum=$sum+$i )) 行,但老实说我无法弄清楚问题是什么。我应该告诉你,我对 bash 脚本编写非常陌生,我用谷歌搜索并在高处和低处搜索了这个问题的答案,但找不到。任何帮助是极大的赞赏。
您正在逐行读取文件,求和行不是算术运算。试试这个:
while read i
do
sum=0
for num in $i
do
sum=$(($sum + $num))
done
echo "$i Sum: $sum"
done <
只需使用 for 循环从每一行拆分每个数字。希望对您有所帮助。
另一种方式(不是纯粹的bash
):
while read line
do
sum=$(sed 's/[ ]\+/+/g' <<< "$line" | bc -q)
echo "$line Sum = $sum"
done < filename
另一种非 bash 方式(反对:OP 要求 bash,赞成:不依赖于 bashisms,使用浮点数)。
awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print [=10=], "Sum:", c}'
使用 numsum -r
util 覆盖行添加,但输出格式需要一点胶水,通过低效的 paste
-ing 一些实用程序:
paste "" \
<(yes "Sum =" | head -$(wc -l < "") ) \
<(numsum -r "")
输出:
1 2 3 4 5 Sum = 15
4 6 7 8 0 Sum = 25
注意 -- 对于给定文件 foo 上的 运行 行,首先像这样初始化 </code>:</p>
<pre><code>set -- "" foo
paste "" <(yes "Sum =" | head -$(wc -l < "") ) <(numsum -r "")