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



我正在尝试编写一个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脚本非常陌生,我已经在谷歌上搜索了这个问题的答案,但找不到。非常感谢任何帮助。

您正在逐行读取文件,行和不是算术运算。试试这个:

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

只是使用for循环从每行拆分每个数字。

另一种非bash方式(缺点:OP要求bash,优点:不依赖bashisms,可以使用浮点数)

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

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

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

使用numsum -r util覆盖行加法,但输出格式需要一点胶水,通过低效的paste -几个util:

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") 

最新更新