2

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

请注意,行数不一定是 80 的倍数,因此对于最后一行,我必须添加剩余的行。

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

谢谢。

注2:文件如下所示:

3.456
3.4
6.788
9.342
... etc ...
4

5 回答 5

4

另一个 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
于 2012-10-19T21:13:23.727 回答
3

我能想到的最短的 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

于 2012-10-20T01:15:58.877 回答
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}'

(经过测试并且有效)

于 2012-10-19T20:50:34.233 回答
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

IHTH。

于 2012-10-19T20:57:56.107 回答
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 行的总和,然后依次打印下一个换行符。

于 2012-10-19T21:48:14.963 回答