我有一個非常大的文本文件,這是一個數字向量,我想將80行一起添加,將結果打印到一個新文件中,然後取第二行81-160行,將它們添加並將結果輸出到新文件的下一行,依此類推,直到文件結束。sum數字每80行一行awk
注意行數不一定是80的倍數,所以對於最後一行我必須添加其餘的行。
是否可以使用awk或類似的編程語言在一行中快速執行此操作?
謝謝。
注2:該文件是這樣的:
3.456
3.4
6.788
9.342
... etc ...
我有一個非常大的文本文件,這是一個數字向量,我想將80行一起添加,將結果打印到一個新文件中,然後取第二行81-160行,將它們添加並將結果輸出到新文件的下一行,依此類推,直到文件結束。sum數字每80行一行awk
注意行數不一定是80的倍數,所以對於最後一行我必須添加其餘的行。
是否可以使用awk或類似的編程語言在一行中快速執行此操作?
謝謝。
注2:該文件是這樣的:
3.456
3.4
6.788
9.342
... etc ...
最短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
條款,則打印最終總和。
我總是使用「-vc = 80」,除非你有一個特定的原因,因爲沒有像上面那樣設置一個變量,所以你可以使用「-vc = 80」需要注意的是變量的值在BEGIN部分中不可用,但在其他方面,這是用慣用awk的正確解決方案。 –
試試這個:
#!/bin/bash
awk 'BEGIN {c=0; tot=0};
{
tot=tot+$1;
c++;
if (c==80) {
print tot;
c=0
tot=0
}
};
END {print tot}'
(測試和它的作品)
這可能不是OP想要的...... – Kent
@Kent fixed =)我剛剛嘗試過(c == 5),並得到了和你一樣的輸出。 –
上面甚至沒有awk語法,所以我不會嘗試它。鼻子惡魔...... –
乾淨的輸出優化版本:
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。
另一個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
謝謝真棒回答 – Dnaiel
這裏是一個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行的總和,然後是下一行,然後連續換行。
有趣的問題。 +1 – Kent