如何在Bash Shell脚本中从文本文件中对一行数字求和

5

我将尝试编写一个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 < $2

要调用该程序,使用-stats -r test_file命令。其中“-r”表示行,目前还没有涉及列的处理。我的当前代码实际上只是将每个列的第一个数字相加,然后其余数字会出现语法错误。它显示错误来自于第16行,也就是(sum=$sum+$i)这一行,但我真的无法找出问题所在。我应该告诉你,我对Bash脚本编写非常新手,并且我已经在Google和其他地方寻找答案很久了,但都找不到。如果您能提供任何帮助,将不胜感激。

我认为你想要的是 sum=$(($sum + $i))。 - Brian Cain
4个回答

3

你正在逐行读取文件,并且总和不是算术运算。尝试这样做:

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

只需使用 for 循环从每行中拆分出每个数字即可。希望这有帮助。


дљ†еПѓдї•е∞Ж sum=$(($sum + $num)) зЃАеМЦдЄЇ ((sum = sum + num))гАВ - jub0bs
或者用declare -i sum=0替换sum=0,并在bash中使用sum+=$num - Cyrus
1
这正是我想要的效果!非常感谢。 - clb

2

另一种不依赖于Bash的方法(缺点:OP要求使用Bash,优点:不依赖Bashisms,适用于浮点数)。

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

0

另一种方法(不是纯粹的bash):

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

0

使用numsum -r实用程序可以完成行相加,但输出格式需要一些粘合剂,通过低效地paste几个实用程序:

paste "$2" \
      <(yes "Sum =" | head -$(wc -l < "$2") ) \
      <(numsum -r "$2") 

输出:

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

请注意 -- 要在给定的文件 foo 上运行上述行,请首先像这样初始化 $2:
set -- "" foo
paste "$2" <(yes "Sum =" | head -$(wc -l < "$2") )  <(numsum -r "$2") 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接