我有一个非常大的文本文件,它是一个数字向量,我想将 80 行加在一起,将结果打印到一个新文件中,然后取第二个 81-160 行,将它们相加并在下一个打印结果新文件的行,依此类推,直到文件结束。
请注意,行数不一定是 80 的倍数,因此对于最后一行,我必须添加剩余的行。
是否可以使用 awk 或类似的编程语言在一行中快速完成此操作?
谢谢。
注2:文件如下所示:
3.456
3.4
6.788
9.342
... etc ...
另一个 awk 单线:
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
我能想到的最短的 awk 解决方案是这样的(如果打高尔夫球,则为 47 个字符):
awk '{ s += $1 } NR % c == 0 { print s; s=0 } END { if(NR % c) print s }' c=80
s
累积总和。s
每 80 行打印和重置总和。该END
子句打印最终总和 if NR % 80 != 0
。
试试这个:
#!/bin/bash
awk 'BEGIN {c=0; tot=0};
{
tot=tot+$1;
c++;
if (c==80) {
print tot;
c=0
tot=0
}
};
END {print tot}'
(经过测试并且有效)
干净的输出版本:
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
IHTH。
这是一个 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 行的总和,然后依次打印下一个换行符。