对位置参数

时间:2017-05-03 15:37:41

标签: linux unix awk sum

我想总结第一个参数给出的文件(列和行)中的所有数字,但我的程序显示sum=sum+$i而不是数字和:

sum=0;
file=$1

for i in $file
do
        sum=sum+$i;
done;
echo "The sum is:  " $sum
  

输入文件:

$cat file.txt
10 20 10
40
50
  

预期产出:

The sum is: 21

也许如果有一种awk方法可以解决这个问题?

4 个答案:

答案 0 :(得分:0)

试试这个 -

$cat file1.txt
10 20 10
40
50
$awk '{for(i=1;i<=NF;i++) {sum+=$i}} END {print sum}' file1.txt
130

OR

$xargs  < file1.txt| tr ' ' + | bc
130

答案 1 :(得分:0)

cat file.txt | xargs | sed -e 's/\ /+/g' | bc

答案 2 :(得分:0)

您还可以使用简单的readarray对依赖于分词的值求和,以通过默认值{{1}将值分隔为数组}(内部字段分隔符),例如

IFS

示例输入文件

#!/bin/bash

declare -i sum=0
fn="${1:-/dev/stdin}"       ## read from file as 1st argument (default stdin) 

while read -r line; do      ## read each line
    a=( $line )             ## separate values into array
    for i in ${a[@]}; do    ## for each value in array
        ((sum += i))        ## add to sum
    done
done <"$fn"

echo "sum: $sum"

示例使用/输出

$ cat dat/numfile.txt
10 20 10
40
50

答案 3 :(得分:0)

另一些​​问题(至少是mawk和gawk):

$ awk -v RS="[^0-9]" '{s+=$1}END{print s}' file   
130