AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 785038
Accepted
Tim
Tim
Asked: 2016-06-10 12:06:13 +0800 CST2016-06-10 12:06:13 +0800 CST 2016-06-10 12:06:13 +0800 CST

如何对文件中的行数求和

  • 772

我有一个看起来像这样的文件:

1
3
4
1
4
3
1
2

我怎样才能找到这个总数(即1+3+4+1+4+3+1+2 = 19)?

bash
  • 7 7 个回答
  • 113756 Views

7 个回答

  • Voted
  1. Best Answer
    heemayl
    2016-06-10T12:08:57+08:002016-06-10T12:08:57+08:00

    bc在一些帮助下,paste将行放在一个单独的行中,并+作为分隔符:

    paste -sd+ file.txt | bc
    

    要使用grep(或任何其他命令)的输出而不是静态文件,请将grep的 STDOUT 传递给 的 STDIN paste:

    grep .... | paste -sd+ | bc
    

    例子:

    % cat file.txt            
    1
    3
    4
    1
    4
    3
    1
    2
    
    % paste -sd+ file.txt | bc
    19
    
    % grep . file.txt | paste -sd+ | bc
    19
    

    如果您必须使用bash,那么您可以使用数组来保存文件内容,然后遍历元素,或者您可以逐行读取文件并对每一行进行求和,第二种方法会更有效:

    $ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
    19
    
    real    0m0.002s
    user    0m0.000s
    sys 0m0.000s
    
    $ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
    19
    
    real    0m0.000s
    user    0m0.000s
    sys 0m0.000s
    
    • 82
  2. CrazyApe84
    2016-06-10T12:21:49+08:002016-06-10T12:21:49+08:00

    你也可以使用 awk。要计算*.txt文件中包含单词“hello”的总行数:

    grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'
    

    简单地将文件中的数字相加:

    awk '{n += $1}; END{print n}' file.txt
    
    • 26
  3. Volker Siegel
    2016-06-10T18:54:02+08:002016-06-10T18:54:02+08:00

    numsum从包装中使用num-utils!

    (您可能需要sudo apt-get install num-utils)

    该命令numsum默认执行您需要的操作;

    $ numsum file.txt 
    19
    

    逐行读取测试编号stdin:

    $ printf '
    1 
    3
    4
    1
    4
    3
    1
    2' | numsum
    19
    

    或从一行读取:

    $ printf '1 3 4 1 4 3 1 2' | numsum -r
    19
    

    更多实用程序

    该软件包包含一些其他值得更广为人知的用于数字处理的实用程序:

    numaverage   - find the average of the numbers, or the mode or median
    numbound     - find minimum of maximum of all lines
    numgrep      - to find numbers matching ranges or sets
    numinterval  - roughly like the first derivative
    numnormalize - normalize numbers to an interval, like 0-1
    numrandom    - random numbers from ranges or sets, eg odd.  
    numrange     - similar to seq
    numround     - round numbers up, down or to nearest
    

    还有一个更通用的计算器命令numprocess,
    它将命令行中的表达式应用于输入行上的数字。

    • 15
  4. gwarah
    2016-06-10T12:32:02+08:002016-06-10T12:32:02+08:00

    您可以使用awk一个原生 linux 应用程序,用于扫描和处理每行模式的文件。对于您的问题,这将产生您想要的:

    awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt
    

    管道也接受:

    cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'
    
    • 3
  5. Sergiy Kolodyazhnyy
    2017-06-03T14:04:53+08:002017-06-03T14:04:53+08:00

    Perl 解决方案:

    $ perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
    19
    

    以上可以将多个文件中的所有数字相加:

    $ perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
    34
    

    对于在命令行上给出的多个文件,我们希望查看单个文件中的数字总和,我们可以这样做:

    $ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
    19 input.txt
    15 input2.txt
    
    • 2
  6. Bastian Bittorf
    2019-09-13T23:42:15+08:002019-09-13T23:42:15+08:00

    一种简单的方法是使用 shell 的内置功能:

    SUM=0; while read N; do SUM=$((SUM+N)); done </path/to/file
    echo $SUM
    

    这会逐行读取您的文件,总结并打印结果。

    如果你想使用管道并且只使用第一行,它的工作方式如下:

    SUM=0
    your_command | while read -r LINE; do for N in $LINE; do break; done; SUM=$((SUM+N)); done
    echo $SUM
    

    获取第一个元素是这样完成的:

    LIST="foo bar baz"
    for OBJ in $LIST; do break; done
    echo $OBJ
    
    foo
    
    • 2
  7. zomfg_zombie
    2016-06-11T04:53:28+08:002016-06-11T04:53:28+08:00

    这是bash脚本的一个相当简单的使用。

    SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
    
    • 1

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve