私はパーサーを書いており、何か素晴らしいことをしなければなりません。私は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
.
.
.
、、、、、はすべて視覚的表現のためで-
あるため、列リストに配置する必要があります|
。start
end
6
3
7
.
.
.
現在の増分を使用しhead -n $i
てtail -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}'
sum
awkでは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行、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