当前位置: 首页 > 编程日记 > 正文

linux 瞬间文件数没了,关于linux:如何快速汇总文件中的所有数字?

我有一个包含几千个数字的文件,每个数字都在自己的行中:

34

42

11

6

2

99

...

我正在写一个脚本,它将打印文件中所有数字的总和。我有解决办法,但效率不高。(运行需要几分钟)我正在寻找更有效的解决方案。有什么建议吗?

你的缓慢解决方案是什么?也许我们可以帮你弄清楚这件事的进展缓慢。:)

@布赖恩·德福伊,我太尴尬了,不能把它发出去。我知道为什么速度慢。这是因为我调用"cat文件名head-n 1"来获取顶部的数字,将其添加到一个连续的总数中,然后调用"cat文件名tail…"来删除下一个迭代的顶行…我有很多关于编程的知识要学!!!!

这是非常系统的。非常清楚和直截了当,我爱它,因为它是一个可怕的可憎。我想,是用你开始时就知道的工具建造的,对吧?

完全复制:stackoverflow.com/questions/450799/…

@马克罗伯茨,你一定花了很长时间才弄明白。这是一种非常清晰的解决问题的技巧,哦,太错了。这看起来像是一个典型的过度思考的案例。Glen Jackman的几个解决方案shell脚本解决方案(其中两个是纯shell,不使用awk和bc)。所有这些都在不到10秒的时间内完成了一百万个数字的相加。看看这些,看看如何在纯壳中完成。

@Mark Roberts 1位,stackoverflow.com/a/18380369/4592448)))

你可以用锥子:

awk '{ sum += $1 } END { print sum }' file

超过程序:最大字段大小数:32767

简单,不需要Perl。这是最好的答案。

如果您的字段包含空格并由制表符分隔,则使用-F '\t'选项。

请将此标记为最佳答案。如果您想在TSV(以制表符分隔的值)文件中对每行的第一个值求和,它也可以工作。

对于一个PerlOne线性,它基本上与Ayman Hourieh的答案中的awk解决方案相同:

% perl -nle '$sum += $_ } END { print $sum'

如果您想知道PerlOne的行程序是做什么的,可以将它们放在下面:

%  perl -MO=Deparse -nle '$sum += $_ } END { print $sum'

结果是程序的一个更详细的版本,形式是没有人会自己写:

BEGIN { $/ ="

"; $\ ="

"; }

LINE: while (defined($_ = )) {

chomp $_;

$sum += $_;

}

sub END {

print $sum;

}

-e syntax OK

只是为了咯咯笑,我用一个包含1000000个数字的文件(在0-9999范围内)尝试了这个方法。在我的Mac Pro上,它几乎瞬间返回。这太糟糕了,因为我希望使用mmap会非常快,但同时:

use 5.010;

use File::Map qw(map_file);

map_file my $map, $ARGV[0];

$sum += $1 while $map =~ m/(\d+)/g;

say $sum;

哇,这显示了对代码-nle实际上包围了你给它的字符串的深刻理解。我最初的想法是你不应该在喝醉的时候发帖,但后来我注意到你是谁,记得你的其他一些Perl答案:—)

-n和-p只是把字符放在参数to-e的周围,这样你就可以用这些字符来做你想要的任何事情。在有效的Perl编程中,我们有很多一行程序可以做一些有趣的事情(即将上架)。

很好,这些不匹配的花括号是关于什么的?

-n在程序中添加了while { }循环。如果你把} ... {放在里面,那么你就得到了while { } ... { }。邪恶?略微。

突出显示-MO=Deparse选项的大奖金!即使是在一个单独的主题上。

您的一行程序的累积版本(滚动总和,打印每行的当前总和):perl -nle '$sum += $_; print $sum} END {'。

到目前为止,没有一种解决方案使用paste。这里有一个:

paste -sd+ filename | bc

例如,计算∑n,其中1<=n<=100000:

$ seq 100000 | paste -sd+ | bc -l

5000050000

(出于好奇,seq n会打印一个从1到n的数字序列,给定一个正数n。)

很不错的!而且很容易记住

非常Unix风格的解决方案=)

在Mac OS X seq 100000 | paste -sd+ - | bc -lBash。This is the sweetest布尔模式的解决方案和unixest!

为了好玩,让我们来测试一下:

$ for ((i=0; i<1000000; i++)) ; do echo $RANDOM; done > random_numbers

$ time perl -nle '$sum += $_ } END { print $sum' random_numbers

16379866392

real    0m0.226s

user    0m0.219s

sys     0m0.002s

$ time awk '{ sum += $1 } END { print sum }' random_numbers

16379866392

real    0m0.311s

user    0m0.304s

sys     0m0.005s

$ time { { tr"

" + < random_numbers ; echo 0; } | bc; }

16379866392

real    0m0.445s

user    0m0.438s

sys     0m0.024s

$ time { s=0;while read l; do s=$((s+$l));done

16379866392

real    0m9.309s

user    0m8.404s

sys     0m0.887s

$ time { s=0;while read l; do ((s+=l));done

16379866392

real    0m7.191s

user    0m6.402s

sys     0m0.776s

$ time { sed ':a;N;s/

/+/;ta' random_numbers|bc; }

^C

real    4m53.413s

user    4m52.584s

sys 0m0.052s

我在5分钟后中止了SED的运行

我一直潜到卢亚,而且速度很快:

$ time lua -e 'sum=0; for line in io.lines() do sum=sum+line end; print(sum)' < random_numbers

16388542582.0

real    0m0.362s

user    0m0.313s

sys     0m0.063s

当我更新这个的时候,Ruby:

$ time ruby -e 'sum = 0; File.foreach(ARGV.shift) {|line| sum+=line.to_i}; puts sum' random_numbers

16388542582

real    0m0.378s

user    0m0.297s

sys     0m0.078s

听从艾德莫顿的建议:使用$1。

$ time awk '{ sum += $1 } END { print sum }' random_numbers

16388542582

real    0m0.421s

user    0m0.359s

sys     0m0.063s

vs使用$0。

$ time awk '{ sum += $0 } END { print sum }' random_numbers

16388542582

real    0m0.302s

user    0m0.234s

sys     0m0.063s

+1:提出一系列解决方案,并进行基准测试。

时间cat随机粘贴-sd+bc-l实0.317s用户0.310s系统0.013s

这应该与tr解决方案大致相同。

如果使用$0而不是$1,那么awk脚本的执行速度应该更快一些,因为如果脚本中特别提到任何字段,awk会进行字段拆分(这显然需要一些时间),但不会进行其他操作。

这工作:

{ tr '

' +; echo 0; } < file.txt | bc

在tr之后加echo 0的原因是什么?

在tr中,您最后得到一个尾随的+:1+2+3+4+,这对bc来说是一个语法错误。所以echo 0来修改语法:1+2+3+4+0。

另一种选择是使用jq:

$ seq 10|jq -s add

55

-s(--slurp)将输入行读入一个数组。

这是一个直接的重击:

sum=0

while read -r line

do

(( sum += line ))

done < file

echo $sum

只要没有小数,这个就行

它可能是最慢的解决方案之一,因此不适用于大量的数据。

这是另一条单线

( echo 0 ; sed 's/$/ +/' foo ; echo p ) | dc

这假设数字是整数。如果您需要小数,请尝试

( echo 0 2k ; sed 's/$/ +/' foo ; echo p ) | dc

将2调整为所需的小数位数。

我更喜欢将GNU数据mash用于此类任务,因为它比Perl或Awk更简洁易读。例如

datamash sum 1 < myfile

其中1表示数据的第一列。

this does not appear to be a标准组件当Do not see恩在我的Ubuntu的安装。我会看到它benchmarked,虽然。

cat nums | perl -ne '$sum += $_ } { print $sum'

(与Brian D Foy的回答相同,没有‘结束’)

为了好玩,让我们用pdl,Perl的数组数学引擎来做吧!

perl -MPDL -E 'say rcols(shift)->sum' datafile

rcols将列读入矩阵(本例中为1d),sum将矩阵的所有元素相加。

如何修复在@inc中找不到pdl.pm(您可能需要安装pdl模块)(@inc包含:/etc/perl/usr/local/lib/x86_-linux-gnu/perl/5.22.1?)当然是为了好玩=)

您必须首先安装PDL,它不是Perl本机模块。

下面是一个使用带有生成器表达式的Python的解决方案。在我的旧电脑上测试了一百万个数字。

time python -c"import sys; print sum((float(l) for l in sys.stdin))" < file

real    0m0.619s

user    0m0.512s

sys     0m0.028s

对于map():map(float, sys.stdin),具有命名函数的简单列表理解是一个很好的用例。

我更喜欢用r来表示:

$ R -e 'sum(scan("filename"))'

$ perl -MList::Util=sum -le 'print sum <>' nums.txt

sed ':a;N;s/

/+/;ta' file|bc

更简洁:

# Ruby

ruby -e 'puts open("random_numbers").map(&:to_i).reduce(:+)'

# Python

python -c 'print(sum(int(l) for l in open("random_numbers")))'

Perl & Nbsp;6

say sum lines

~$ perl6 -e '.say for 0..1000000' > test.in

~$ perl6 -e 'say sum lines' < test.in

500000500000

与露比:

ruby -e"File.read('file.txt').split.inject(0){|mem, obj| mem += obj.to_f}"

another option(when is is ruby -e'p readlines.map(&:to_f).reduce(:+)'输入从标准输入(stdin))。

另一个娱乐

sum=0;for i in $(cat file);do sum=$((sum+$i));done;echo $sum

或者只是一次狂欢

s=0;while read l; do s=$((s+$l));done

但awk解决方案可能是最好的,因为它是最紧凑的。

我没有测试过这个,但是它应该可以工作:

cat f | tr"

""+" | sed 's/+$/

/' | bc

如果BC不处理EOF和EOL,您可能需要在BC之前向字符串添加""(如通过echo)。

它不起作用。bc由于尾随"+"和结尾缺少换行符,发出语法错误。这将起作用,并消除了对cat的无用使用:{ tr"

""+" | sed 's/+$/

/'| bc; } < numbers2.txt或。

tr"

""+"

考虑到你需要通读整个文件,我不知道你是否能比这更好。

$sum = 0;

while(<>){

$sum += $_;

}

print $sum;

美元是什么意思?

非常可读。对于Perl。但是,是的,必须是这样的…

$_是默认变量。行输入操作符<>在while中使用<>时,默认将其结果放在那里。

@mark,$_是主题变量——它的工作方式与"it"类似。在这种情况下,<>为它分配每一行。它被用于许多地方,以减少代码混乱并帮助编写一行程序。脚本说"将和设置为0,读取每一行并将其添加到和中,然后打印和。"

@stefan,关闭警告和限制后,您可以跳过声明和初始化$sum。由于这很简单,您甚至可以使用语句修饰符while:$sum += $_ while <>; print $sum;。

您可以使用alacon命令行实用程序对alasql数据库执行此操作。

它与node.js一起工作,因此需要先安装node.js,然后安装alasql包:

要从txt文件计算总和,可以使用以下命令:

> node alacon"SELECT VALUE SUM([0]) FROM TXT('mydata.txt')"

这里还有一个:

open(FIL,"a.txt");

my $sum = 0;

foreach( ) {chomp; $sum += $_;}

close(FIL);

print"Sum = $sum

";

用+替换所有新行,增加0并发送给Ruby解释器并不容易?

(sed -e"s/$/+/" file; echo 0)|irb

如果没有irb,可以发送到bc,但是除了最后一条(echo)之外,必须删除所有新行。最好是用tr来做这个,除非你有sed的博士学位。

(sed -e"s/$/+/" file|tr -d"

"; echo 0)|bc

C总是以速度取胜:

#include

#include

int main(int argc, char **argv) {

ssize_t read;

char *line = NULL;

size_t len = 0;

double sum = 0.0;

while (read = getline(&line, &len, stdin) != -1) {

sum += atof(line);

}

printf("%f", sum);

return 0;

}

1米数字的计时(与我的python答案相同的机器/输入):

$ gcc sum.c -o sum && time ./sum < numbers

5003371677.000000

real    0m0.188s

user    0m0.180s

sys     0m0.000s

你错过了要点

最佳答案!最佳速度)

cat f | tr"

""+" | perl -pne chop | R --vanilla --slave

可笑的是:

cat f | tr"

""+" | perl -pne chop | R --vanilla --slave

这一个最终死于"错误:评估嵌套太深:无限递归/选项(表达式=)?"为了我的测试。我本以为R自己就能做到这一切的。

哈哈,好办法。

相关文章:

js短路运算符

在JS函数中我们经常会使用到短路运算符&#xff0c;主要是逻辑与&#xff08;&&&#xff09; 和 逻辑或&#xff08;||&#xff09; 1、逻辑与 && 的运算方式 var a 5 && 6; console.log(a); //返回的结果为 6 如果逻辑与运算符左边的值布尔转换后为t…

python终止线程报错_退出整个程序时出现python线程异常错误

嗨&#xff0c;伙计们我正在用python2.4.3和wxpython开发一个GUI。除了退出主程序(关闭GUI的主窗口)之外&#xff0c;一切正常。最重要的是&#xff0c;有时会有这样的错误&#xff0c;有时根本就没有错误。尽管我从python邮件列表中找到了相同的错误报告(链接是http://bugs.py…

php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架

如何提高自己编写代码的能力呢&#xff1f;我们首先想到的是阅读学习优秀的开源项目&#xff0c;然后写一个自己的web框架或类库组件。作为web开发者&#xff0c;我们通常都是基于面向对象OOP来开发的&#xff0c;所以面向对象的设计能力或者说设计模式的运用能力尤为重要&…

针对七牛含有特殊字符的文件名,对特殊字符编码处理

源字符串: a a 1 ~!#$%^&()_-{}[];,.- 编码后: a%20a%201%20~%60%21%23$%25%5E&%28%29_-%7B%7D%5B%5D;%27,.-%20 源字符串&#xff1a; 变 ~&#xff01;#&#xffe5;%…………&&#xff08;&#xff09;——-{}&#xff1a;“&#xff1b;‘、《》&#xff1f;&…

linux sftp权限设置,Linux设置SFTP服务用户目录权限

我们有时会遇到这样的需求&#xff0c;限制一个Linux用户&#xff0c;让他只能在指定的目录下进行添加、修改、删除操作&#xff0c;并且只能使用sftp登录服务器&#xff0c;不能用ssh操作。这些可以通过配置sftp服务实现。提供sftp服务的有vsftpd和internal-sftp&#xff0c;这…

mybatis动态sql中的trim标签的使用

trim标记是一个格式化的标记&#xff0c;可以完成set或者是where标记的功能&#xff0c;如下代码&#xff1a; 1、 select * from user <trim prefix"WHERE" prefixoverride"AND |OR"> <if test"name ! null and name.length()>0"&…

smarty mysql demo_PHP Smarty模版简单使用方法

本文实例讲述了PHP Smarty模版简单使用方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;Index.php&#xff1a;require(../libs/Smarty.class.php);$smarty new Smarty;// 添加自定义调节器$smarty->registerPlugin("modifier", "e", &quo…

php webuploader大文件,web uploader 上传大文件总结

由于业务需要&#xff0c;需要上传大文件&#xff0c;已有的版本无法处理IE版本&#xff0c;经过调研&#xff0c;百度的 webuploader 支持 IE 浏览器&#xff0c;而且支持计算MD5值&#xff0c;进而可以实现秒传的功能。大文件上传主要分为三部分&#xff0c;预上传&#xff0…

cfl3d linux 编译,CMake build system for cfl3d

-0,0 1,379 ---title: cfl3dopenmpigfortran编译和安装---#简介cfl3d用intel的编译器和mpi会比较容易编译&#xff0c;不再详述。本文主要讲述用gfortran的情况cfl3d依赖于cgns, fortran编译器和mpi- mpi&#xff1a;只要是符合mpi1.1的标准的MPI应该都可以的,mpich, openmpi, …

Request.getInputStrema只能读取一次的分析过程

1. 我们先来看一下继承关系HttpServletRequest 接口继承ServletRequest接口 public abstract interface ServletRequest{ public abstract ServletInputStream getInputStream() throws IOException; &#xff5d; 从上面可知request.getInputStream()返回的是ServletInputSt…

windows nodejs mysql_windows server 安装 mysql + nondejs连接mysql

下载安装下载完后&#xff0c;将 zip 包解压到相应的目录&#xff0c;这里我将解压后的文件夹放在 C:\mysql 下。接下来需要配置下 MySQL 的配置文件打开刚刚解压的文件夹 C:\mysql &#xff0c;在该文件夹下创建 my.ini 配置文件&#xff0c;编辑 my.ini 配置以下基本信息&…

多线程并行和并发的区别

并行就是两个任务同时运行&#xff0c;就是甲任务进行的同时&#xff0c;乙任务也在进行。(需要多核CPU) 并发是指两个任务都请求运行&#xff0c;而处理器只能按受一个任务&#xff0c;就把这两个任务安排轮流进行&#xff0c;由于时间间隔较短&#xff0c;使人感觉两个任务都…

php dropdownlist,为何activitieDropdownlist的值始终无法获取到

为什么activitieDropdownlist的值始终无法获取到&#xff1f;视图层view控制器层public function actionDbdplist(){$m_subjectlist new SubjectList();$m_gradelist new Grade;$this->subject_list SubjectList::model()->findAll();$this->grade_list Grade::mo…

python之内置函数

一、 内置函数 什么是内置函数&#xff1f;就是python给你提供的可以直接使用的函数。到目前为止在python中一共有68个内置函数 经过我两个多小时的制作终于弄出了个能看的东西↓↓↓↓↓↓ 思维导图链接:https://www.processon.com/view/link/5b72a285e4b053a09c33e534 转载于…

远程桌面linux服务器配置,linux平台下远程桌面服务器的安装和设置

一、xdm 方式前提&#xff1a;安装linux时一定要选上xwindow&#xff0c;这是最基本的前提&#xff0c;不安装它&#xff0c;是绝对没有图形界面的。**********************************************************基本概念和相关命令说明&#xff1a;XDMCP(X Display Manager Co…

关于字符串的分割问题

1、如何快速的将一个字符串分割成一个个字符&#xff1f; Scanner scnew Scanner(System.in);System.out.println("请输入一个字符串&#xff1a;");String strsc.next();System.out.println("输入的字符串的长度为&#xff1a;"str.length());char [] ast…

java创建对象_java 创建对象的五种方式

通过 Class 对象的 getConstructor 可以获取 java.lang.reflect.Constructor 对象Constructor 对象用来描述类的构造方法&#xff0c;通过给 getConstructor 方法传入不同的 Class 对象&#xff0c;可以获取到对应的无参或有参数的构造方法通过 Constructor 的 newInstance 方法…

php拍照从手机相册中选择,微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例...

本文实例讲述了微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;目前中js-sdk 1.0版本中&#xff0c;预览图片提供了2个接口&#xff0c;接口的定义参考官方文档1.预览网络图片http链接的2.预览本地图片wenxin:…

BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

题意 有 \(n\) 个人&#xff0c;每个人手里有一把手枪。一开始所有人都选定一个人瞄准&#xff08;有可能瞄准自己&#xff09;。然后他们按某个顺序开枪&#xff0c;且任意时刻只有一个人开枪。 因此&#xff0c;对于不同的开枪顺序&#xff0c;最后死的人也不同。 问最后死的…

Maven跳过测试

Maven跳过测试用例 在properties中声明<properties><maven.test.skip>true</maven.test.skip> </properties> 或者 <properties><skipTests>true</skipTests> </properties> 在执行命令中声明mvn test -Dmaven.test.skiptrue …

Linux内核 题目,《Linux内核完全注释》部分习题答案

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第3章 内核引导和启动过程2.为什么不直接将system模块搬到0x00000处而是先搬到0x10000处&#xff0c;再搬到0x00000处呢&#xff1f;在机器开机上电时&#xff0c;ROM BIOS将bootsect代码加载到内存的固定位置0x7c00处&#xff0c;…

java jdk 1.8 安装_下载、安装、配置 java jdk1.8

近期配置react native的开发环境&#xff0c;所以就从配置环境开始。rn的环境配置有那么几项&#xff0c;其中重要的一个就是java jdk(Java Development Kit 的缩写)&#xff0c;那么以下就是下载、安装还有配置的流程1.下载java jdk 1.8在地址栏输入 java jdk,如下图所示&…

liunx php redis扩展,CentOS 7下安装php-redis扩展及简单使用

前言&#xff1a;在本篇文章中&#xff0c;我将给大家介绍如何在CentOS7上安装PHP-Redis扩展以及一些简单的实用&#xff0c;关于如何在Centos上安装redis的&#xff0c;可以参考想要在php中操作redis&#xff0c;那就必须安装php-redis扩展&#xff0c;就比如MySQL一样&#x…

Luogu 2470 [SCOI2007]压缩

和Luogu 4302 [SCOI2003]字符串折叠 差不多的想法&#xff0c;区间dp 为了计算方便&#xff0c;我们可以假设区间[l, r]的前面放了一个M&#xff0c;设$f_{i, j, 0/1}$表示区间$[i, j]$中是否存在M 因为这题只能是二的幂次倍压缩&#xff0c;所以转移的时候枚举中点chk是否合法…

做图形处理Linux小型主机,8个优秀的linux图形图像工具

对艺术家、摄影师、动画师和设计师而言&#xff0c;Linux是一个有潜力的平台。廉价的硬件&#xff0c;优秀的免费软件&#xff0c;任何有才华的人都能在上面创作专业水平的计算机图形。开源社区提供了丰富的开源图形工具&#xff0c;但要慧眼识珠并非易事。这里介绍的优秀图形工…

使用laravel框架的eloquent\DB模型连接多个数据库

1、配置.env文件 DB_HOST_TRAILER127.0.0.1DB_PORT_TRAILER3306DB_DATABASE_TRAILERhtms_trailerDB_USERNAME_TRAILERrootDB_PASSWORD_TRAILER DB_HOST_FREIGHT127.0.0.1DB_PORT_FREIGHT3306DB_DATABASE_FREIGHThangli_saasDB_USERNAME_FREIGHTrootDB_PASSWORD_FREIGHT 2、配置…

java openfile busy_android java.io.IOException: open failed: EBUSY (Device or resource busy)

今天遇到一个奇怪的问题&#xff0c;测试在程序的下载界面&#xff0c;下载一个文件第一次下载成功&#xff0c;删除后再下载结果下载报错&#xff0c;程序&#xff1a;file.createNewFile();报错&#xff1a;java.io.IOException: open failed: EBUSY (Device or resource bus…

java service注入失败,使用spring向service里面注入dao不成功。

使用spring向service里面注入dao不成功。求救啊&#xff01;本帖最后由 PaperStar 于 2013-12-26 19:29:20 编辑页面调用action&#xff0c;action调用service&#xff0c;service调用dao用Debug查看action调用service方法时service有值&#xff0c;但是service调用dao时&#…

下面为初学者分享一下SQL 数据库学习资料

一、基础1、说明&#xff1a;创建数据库CREATE DATABASE database-name2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开…

linux7设置时间,CentOS 7 设置日期和时间

现代操作系统分为以下两种类型的时钟&#xff1a;实时时钟(Real-Time Clock&#xff0c;RTC)&#xff0c;通常称为硬件时钟(一般是系统主板上的集成电路)&#xff0c;它完全独立于操作系统的当前状态&#xff0c;即使在计算机关闭时也能运行。系统时钟&#xff0c;也称为软件时…