在整数BASH列中每5行添加一次

时间:2017-06-22 00:27:03

标签: bash shell

我正在写一个解析器,并且必须有一些奇特的东西。我试图不使用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列。

如果有人有任何补充,我会很感激。如果需要更多信息,请告诉我。

谢谢

2 个答案:

答案 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