代码之家  ›  专栏  ›  技术社区  ›  Jubal

Bash命令对一列数字求和[重复]

  •  307
  • Jubal  · 技术社区  · 14 年前

    我想要一个bash命令,我可以通过管道将一列数字相加。我只想要一个快速的一行,基本上会这样做:

    cat FileWithColumnOfNumbers.txt | sum
    
    10 回复  |  直到 9 年前
        1
  •  918
  •   Dimitre Radoulov    3 年前

    使用现有文件:

    paste -sd+ infile | bc
    

    使用标准输入:

    <cmd> | paste -sd+ | bc
    

    编辑: 用一些 在阅读时需要更加明确的实现

    <cmd> | paste -sd+ - | bc

    :

    -s(串行)-将所有行合并为一行

    + 在这种情况下)

        2
  •  197
  •   ghostdog74    14 年前

    我喜欢选择的答案。但是,它往往比awk慢,因为需要两个工具来完成这项工作。

    $ wc -l file
    49999998 file
    
    $ time paste -sd+ file | bc
    1448700364
    
    real    1m36.960s
    user    1m24.515s
    sys     0m1.772s
    
    $ time awk '{s+=$1}END{print s}' file
    1448700364
    
    real    0m45.476s
    user    0m40.756s
    sys     0m0.287s
    
        3
  •  70
  •   codeforester    7 年前

    以下命令将添加所有行(awk输出的第一个字段)

    awk '{s+=$1} END {print s}' filename
    
        4
  •  60
  •   Jonathan Leffler    14 年前

    awk '{ sum += $1; }
         END { print sum; }' "$@"
    

    sum < FileWithColumnOfNumbers.txt
    sum   FileWithColumnOfNumbers.txt
    

    FWIW:在MacOS X上,您可以使用一行程序:

    awk '{ sum += $1; } END { print sum; }' "$@"
    
        5
  •  18
  •   Dimitre Radoulov    14 年前

    【Ghostdog74评论后续】

    bash-2.03$ uname -sr
    SunOS 5.8
    
    bash-2.03$ perl -le 'print for 1..49999998' > infile
    
    bash-2.03$ wc -l infile
     49999998 infile
    
    bash-2.03$  time paste -sd+ infile | bc
    bundling space exceeded on line 1, teletype
    Broken Pipe
    
    real    0m0.062s
    user    0m0.010s
    sys     0m0.010s
    
    bash-2.03$ time nawk '{s+=$1}END{print s}' infile
    1249999925000001
    
    real    2m0.042s
    user    1m59.220s
    sys     0m0.590s
    bash-2.03$ time /usr/xpg4/bin/awk '{s+=$1}END{print s}' infile
    1249999925000001
    
    real    2m27.260s
    user    2m26.230s
    sys     0m0.660s
    
    bash-2.03$ time perl -nle'
      $s += $_; END { print $s }
       ' infile
    1.249999925e+15
    
    real    1m34.663s
    user    1m33.710s
    sys     0m0.650s
    
        6
  •  13
  •   DVK    14 年前

    $ cat n
    1
    2
    3
    $ (cat n | tr "\012" "+" ; echo "0") | bc 
    6
    

    这个 tr 将所有换行符更改为“+”;然后在最后一个加号后面加上0,然后通过管道传递表达式( 1+2+3+0

    或者,如果您可以使用awk或perl,这里有一个perl一行程序:

    $perl -nle '$sum += $_ } END { print $sum' n
    6
    
        7
  •  11
  •   Dennis Williamson    14 年前
    while read -r num; do ((sum += num)); done < inputfile; echo $sum
    
        8
  •  6
  •   t6d    14 年前

    使用 for

    sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
    
        9
  •  5
  •   Joe Cannatti    10 年前

    如果你安装了ruby

    cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
    
        10
  •  -5
  •   khagler    10 年前
    [root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)