Scripting

每 5 行整數相加

  • June 22, 2017

我正在寫一個解析器,並且必須做一些花哨的事情。我試圖不使用 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 $itail -n 5從列表中刪除 5 行,然後paste -sd+ - | bc將所有值相加。但這太慢了,因為有 100,000 行。

我怎樣才能做得更好?

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

sum在 awk 中從 0 開始。每五行列印目前的數字總和,然後將總和重置為零並遍歷接下來的五行。最後END處理文件中行數不是 5 的倍數的邊緣情況,例如,如果文件中有 18 行,它將列印最後 3 行的總和。當行數是五的倍數時,它還處理不列印不需要的零的邊緣情況。

引用自:https://unix.stackexchange.com/questions/372603