我正在写一个解析器,并且必须有一些奇特的东西。我试图不使用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列。
如果有人有任何补充,我会很感激。如果需要更多信息,请告诉我。
谢谢
答案 0 :(得分:4)
看起来awk
是一种自然的工具:
awk '{ sum += $1 } NR % 5 == 0 { print sum; sum = 0 }'
将第1列中的值添加到sum
。如果模5的记录号为0,则打印总和并将其重置为0.请注意,如果最后一组记录很短(组中有1-4个元素),则不打印它们的总和。如果您希望打印短组的总和,请将END { if (NR % 5 != 0) print sum }
添加到脚本中。
由于这使用单个命令对数据文件进行单次传递,因此很难超越它。使用Perl可能会快一些。我不知道Python如何对抗Awk或Perl。
答案 1 :(得分: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