정수 행 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 
. 
.
.

, -, |, 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}'

sumawk에서는 0부터 시작합니다. 다섯 번째 줄마다 현재 숫자 합계를 인쇄한 다음 합계를 0으로 재설정하고 다음 다섯 줄에 대해 계속합니다. 마지막은 END파일의 줄 수가 5의 배수가 아닌 경우를 처리합니다. 예를 들어 파일에 18줄이 있으면 마지막 3줄의 합계를 인쇄합니다. 또한 줄 수가 5의 배수일 때 원치 않는 0을 인쇄하지 않는 극단적인 경우도 처리합니다.

답변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. 0개 행, 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

관련 정보