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

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

php 依赖注入框架,通过实现依赖注入和路由,构建一个自己的现代化PHP框架
如何提高自己编写代码的能力呢?我们首先想到的是阅读学习优秀的开源项目,然后写一个自己的web框架或类库组件。作为web开发者,我们通常都是基于面向对象OOP来开发的,所以面向对象的设计能力或者说设计模式的运用能力尤为重要&…

针对七牛含有特殊字符的文件名,对特殊字符编码处理
源字符串: a a 1 ~!#$%^&()_-{}[];,.- 编码后: a%20a%201%20~%60%21%23$%25%5E&%28%29_-%7B%7D%5B%5D;%27,.-%20 源字符串: 变 ~!#¥%…………&()——-{}:“;‘、《》?&…

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

mybatis动态sql中的trim标签的使用
trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码: 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模版简单使用方法。分享给大家供大家参考,具体如下:Index.php:require(../libs/Smarty.class.php);$smarty new Smarty;// 添加自定义调节器$smarty->registerPlugin("modifier", "e", &quo…

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

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

Request.getInputStrema只能读取一次的分析过程
1. 我们先来看一下继承关系HttpServletRequest 接口继承ServletRequest接口 public abstract interface ServletRequest{ public abstract ServletInputStream getInputStream() throws IOException; } 从上面可知request.getInputStream()返回的是ServletInputSt…

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

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

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

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

远程桌面linux服务器配置,linux平台下远程桌面服务器的安装和设置
一、xdm 方式前提:安装linux时一定要选上xwindow,这是最基本的前提,不安装它,是绝对没有图形界面的。**********************************************************基本概念和相关命令说明:XDMCP(X Display Manager Co…

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

java创建对象_java 创建对象的五种方式
通过 Class 对象的 getConstructor 可以获取 java.lang.reflect.Constructor 对象Constructor 对象用来描述类的构造方法,通过给 getConstructor 方法传入不同的 Class 对象,可以获取到对应的无参或有参数的构造方法通过 Constructor 的 newInstance 方法…

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

BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪。一开始所有人都选定一个人瞄准(有可能瞄准自己)。然后他们按某个顺序开枪,且任意时刻只有一个人开枪。 因此,对于不同的开枪顺序,最后死的人也不同。 问最后死的…

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处,再搬到0x00000处呢?在机器开机上电时,ROM BIOS将bootsect代码加载到内存的固定位置0x7c00处,…

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

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

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

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

使用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)
今天遇到一个奇怪的问题,测试在程序的下载界面,下载一个文件第一次下载成功,删除后再下载结果下载报错,程序:file.createNewFile();报错:java.io.IOException: open failed: EBUSY (Device or resource bus…

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

下面为初学者分享一下SQL 数据库学习资料
一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开…

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