2

数値のベクトルである非常に大きなテキストファイルがあり、80行を足し合わせて結果を新しいファイルに出力し、次に2番目の81〜160行を足して、次の行に結果を印刷したいと思います。新しいファイルの行など、ファイルの終わりまで続きます。

行数は必ずしも80の倍数ではないことに注意してください。したがって、最後の行については、残りの行を追加する必要があります。

awkまたは同様のプログラミング言語を使用して、これを1行で高速に実行することは可能ですか?

ありがとう。

注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合計を累積します。80 行ごとに合計が出力され、sリセットされます。このEND句は、 if の最終合計を出力しNR % 80 != 0ます。

于 2012-10-20T01:15:58.877 に答える
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 に答える
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 に答える
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 に答える