2012-10-19 86 views
2

我有一個非常大的文本文件,這是一個數字向量,我想將80行一起添加,將結果打印到一個新文件中,然後取第二行81-160行,將它們添加並將結果輸出到新文件的下一行,依此類推,直到文件結束。sum數字每80行一行awk

注意行數不一定是80的倍數,所以對於最後一行我必須添加其餘的行。

是否可以使用awk或類似的編程語言在一行中快速執行此操作?

謝謝。

注2:該文件是這樣的:

3.456 
3.4 
6.788 
9.342 
... etc ... 
+0

有趣的問題。 +1 – Kent

回答

3

最短AWK溶液我可以想出本(47個字符如果golfed):

awk '{ s += $1 } NR % c == 0 { print s; s=0 } END { if(NR % c) print s }' c=80 

s累積總和。每打印80行數據,s復位。如果NR % 80 != 0條款輸入END條款,則打印最終總和。

+1

我總是使用「-vc = 80」,除非你有一個特定的原因,因爲沒有像上面那樣設置一個變量,所以你可以使用「-vc = 80」需要注意的是變量的值在BEGIN部分中不可用,但在其他方面,這是用慣用awk的正確解決方案。 –

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}' 

(測試和它的作品)

+0

這可能不是OP想要的...... – Kent

+0

@Kent fixed =)我剛剛嘗試過(c == 5),並得到了和你一樣的輸出。 –

+0

上面甚至沒有awk語法,所以我不會嘗試它。鼻子惡魔...... –

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。

+0

如果(tot <0)爲'if(tot!= 0)'?而且即使這樣,負數和負數的總和也爲零。如果你使用'if(NR%80!= 0)',那麼你就會有一個準確的條件,我相信。 –

+0

輸出是否正確? END中的(tot <0)是什麼意思? – Kent

+0

@kent:tot <0只有在滿足條件NR%30的記錄數不平衡時纔有值。 JL有兩個更好的解決方案。 (我用2個值輕鬆測試,其中一個是NR的偶數除數,而另一個值意味着其他的條件沒有被解僱,兩個測試都使用了快速設置。 – shellter

4

另一個AWK單行:

awk '{s+=$0;if(NR%80==0){print s-r;r=s}}END{if(s!=r)print s-r}' file 

測試與SEQ 21和每行:

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 
+0

謝謝真棒回答 – Dnaiel

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行的總和,然後是下一行,然後連續換行。