汇总每80行一行awk

时间:2012-10-19 20:47:13

标签: linux shell unix scripting awk

我有一个非常大的文本文件,它是一个数字向量,我想一起添加80行,将结果打印到一个新文件中,然后取第二行81-160行,添加它们并打印结果在新文件的下一行,依此类推,直到文件结束。

注意,行数不一定是80的倍数,所以对于最后一行,我必须添加其余行。

是否可以使用awk或类似的编程语言在一行中快速完成此操作?

感谢。

注2:文件如下所示:

3.456
3.4
6.788
9.342
... etc ...

5 个答案:

答案 0 :(得分:4)

另一个awk one-liner:

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行的总和,然后依次打印换行符。