我有一个非常大的文本文件,它是一个数字向量,我想一起添加80行,将结果打印到一个新文件中,然后取第二行81-160行,添加它们并打印结果在新文件的下一行,依此类推,直到文件结束。
注意,行数不一定是80的倍数,所以对于最后一行,我必须添加其余行。
是否可以使用awk或类似的编程语言在一行中快速完成此操作?
感谢。
注2:文件如下所示:
3.456
3.4
6.788
9.342
... etc ...
答案 0 :(得分:4)
awk '{s+=$0;if( NR%80==0){print s-r;r=s}}END{if(s!=r)print s-r}' file
使用 seq 21 和每个 5 行进行测试:
kent$ seq 21|awk '{s+=$0;if(NR%5==0){print s-r;r=s}}END{if(s!=r)print s-r}'
15
40
65
90
21
答案 1 :(得分:3)
我能想出的最短的awk解决方案是(如果打高尔夫球,则为47个字符):
awk '{ s += $1 } NR % c == 0 { print s; s=0 } END { if(NR % c) print s }' c=80
s
累积总和。打印总和每80行,重置s
。如果END
,则NR % 80 != 0
子句打印最终总和。
答案 2 :(得分:1)
试试这个:
#!/bin/bash
awk 'BEGIN {c=0; tot=0};
{
tot=tot+$1;
c++;
if (c==80) {
print tot;
c=0
tot=0
}
};
END {print tot}'
(经过测试并且有效)
答案 3 :(得分:1)
清理输出版本:
awk '{
if ( NR%80 ){tot+=$0}
else{tot+=$0;print tot; tot=0}
}
END {if (NR%80 !=0 ) print tot}
' file > sumFile
请注意,您可以将80更改为任何值。
调试版
awk '{
if ( NR%80 ){
print "line="$0;tot+=$0}
else{
print "2line="$0;
tot+=$0;
print "tot="tot;
tot=0
}
}
END {
if (NR%80!=0) print "2tot="tot
}' file
使用。
答案 4 :(得分:0)
这是一个Perl解决方案:
#!/usr/bin/perl
use strict;
use warnings;
open( my $fh, '<', 'nums.txt' ) or die $!;
open( my $out, '>', 'res.txt' ) or die $!;
my $sum = 0;
my $line_count = 1;
while (<$fh>) {
$line_count++;
chomp;
$sum += $_;
if ( $line_count == 80 or eof($fh) ) {
print $out "$sum\n";
$line_count = 0;
$sum = 0;
}
}
close($fh);
close($out);
文件名也由你决定。它将打印前80行的总和,然后依次打印换行符。