整数行5個ごとに追加

整数行5個ごとに追加

私はパーサーを書いており、何か素晴らしいことをしなければなりません。私はPythonを使用しないようにしていますが、この時点で使用する必要があるかもしれません。

次のSTDOUTが提供されます。

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

100,000行の場合。私がしなければならないことは、次のように5つずつ追加するだけです。

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 
. 
.
.

、、、、、はすべて視覚的表現のためで-あるため、列リストに配置する必要があります|startend

 6
 3
 7
 .
 .
 .

現在の増分を使用しhead -n $itail -n 5リストから5行を削除してから、すべての値paste -sd+ - | bcを一緒に追加する方法があります。しかし、100,000行があるので、これは遅すぎます。

どうすればもっとうまくいくことができますか?

答え1

cat numbers.txt | awk '{sum += $1; if (NR % 5 == 0) {print sum; sum=0}} END {if (NR % 5 != 0) print sum}'

sumawkでは0から始まります。 5行目ごとに現在の数値の合計を印刷し、合計を0にリセットし、次の5行に進みます。最後は、ENDファイルの行数が5の倍数でない場合を処理します。たとえば、ファイルに18行がある場合は、最後の3行の合計を印刷します。また、行数が5の倍数の場合、不要なゼロを印刷しない極端なケースも処理します。

答え2

そしてシェルループ(エラーチェックなし、5の偶数倍数であると仮定):

while read a; do read b; read c; read d; read e; echo $((a+b+c+d+e)); done < input

答え3

sed '$!N;$!N;$!N;$!N;s/\n/+/g' list.txt | bc

デモ:

$ seq 33 | sed '$!N;$!N;$!N;$!N;s/\n/+/g'
1+2+3+4+5
6+7+8+9+10
11+12+13+14+15
16+17+18+19+20
21+22+23+24+25
26+27+28+29+30
31+32+33
$ seq 33 | sed '$!N;$!N;$!N;$!N;s/\n/+/g' | bc
15
40
65
90
115
140
96
$ 

このアプローチには、次のようないくつかの利点があります。

  1. シンプル
  2. 早く
  3. 数値のグループ化を数学から完全に分離して維持します。
  4. ゼロ行、1行、5n行、および5つ以外の行の倍数を正しく処理します。

追加のエントリを削除するには(たとえば、上記の例では31から33に削除)、すべての条件を削除できます$!。ここではより簡単なコマンドと最初の試みがあります。

$ seq 33 | sed 'N;N;N;N;s/\n/+/g'
1+2+3+4+5
6+7+8+9+10
11+12+13+14+15
16+17+18+19+20
21+22+23+24+25
26+27+28+29+30
$ 

答え4

まず、xargsだけが必要だからです。

<file xargs -rn5 perl -e 'foreach(@ARGV){$a+$_};print $a,"\n"'

しかし、速度のために通訳者の呼び出し回数を最小限にしたいので、次のようにします。

perl -e 'while(!eof(ARGV){print <>+<>+<>+<>+<>,"\n"}' file

関連情報