2017-06-22 14 views
1

私はパーサーを書いています。私は、Pythonを使用しないようにしようとしていますが、私はこの時点でする必要があります。およそ100,000行については整数の列に5行ごとに加算するBASH

1 
0 
2 
3 
0 
0 
1 
0 
0 
2 
0 
3 
0 
4 
0 
5 
0 
2 
. 
. 
. 

は、次のようになりますSTDOUTを考えます。

6 
3 
7 
. 
. 
. 

1 - start 
0 | 
2 | - 6 
3 | 
0 - end 
0 - start 
1 | 
0 | - 3 
0 | 
2 - end 
0 - start 
3 | 
0 | - 7 
4 | 
0 - end 
5 
0 
2 
. 
. 
. 

-|は、startは、endは、すべての視覚的な表現のために、私はちょうど列リストにそれを必要としている:私は何をする必要があることはそうのように、すべての5を足しています

私は現在、インクリメントhead -n $itail -n 5を使用してリストから5行を削除する方法を持っています。次に、paste -sd+ - | bcを使用してすべての値を加算します。しかし、100,000の列があるため、これは遅くなります。

誰かが何か追加したいのであれば、私はそれを感謝します。もっと情報が必要な場合はお知らせください。

awkが使用する自然なツールであるように見えますあなた

+0

'perlの-lne「$ T + = $ _;場合(ない$%5。){印刷$ tの。 $ t = 0;} 'ファイル' –

+0

ゴルフ、ええ@ k-five? 'awk' 0 *(t + = $ 1)== NR%5 {print t; t = 0} 'ファイル'は18文字短いです:-) –

答えて

4

ありがとう:

awk '{ sum += $1 } NR % 5 == 0 { print sum; sum = 0 }' 

sumに列1の値を追加します。 5を法とするレコード番号が0の場合は、合計を出力して0にリセットします。最後のレコードグループが短い場合(グループ内の1〜4要素)、合計は印刷されません。ショートグループの合計を印刷する場合は、END { if (NR % 5 != 0) print sum }をスクリプトに追加します。

これは、単一のコマンドを使用してデータファイルを1回通過するので、それを叩くのは難しいでしょう。 Perlの使用は少し速いかもしれません。私はPythonがAwkとPerlのどちらに対して対処するのか分かりません。

+0

100k行で無駄な0.055sを取った。 – Jack

+2

@Jack:あなたが代替言語でそれを打つことができるかどうかは関係ありません。カーネルのファイルバッファキャッシュに既にあるファイルの大半が恩恵を受けたと思います。しかし、それは任意のタイミング図を持って良いです。ありがとう! –

3

awkを使用できます。 セイfile1という名前のファイルが

1 
0 
2 
3 
0 
0 
1 
0 
0 
2 
0 
3 
0 
4 
0 
5 
0 
. 
. 
. 

が含まれているので、awkコマンドのような行く:

awk 'begin{sum=0;} {sum=sum+1;if(NR%5==0){print sum;sum=0;}}' file1 
+1

Awkでは、変数は自動的に0(または空文字列)に初期化されるので、 'begin'ブロック(通常は大文字で' BEGIN'と綴られています)は本当に必要ありません。行ごとのコードでは、合計に '$ 1'ではなく' '1 'を追加します。行を数え、その行の値を合計しないでください。あなたのサンプルデータからの出力(それらの上に点がある3行は無視されます)は、3行が '5'です。 –

関連する問題