나는 파서를 작성 중이고 뭔가 멋진 일을 해야 합니다. 나는 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부터 시작합니다. 다섯 번째 줄마다 현재 숫자 합계를 인쇄한 다음 합계를 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
$
이 접근 방식에는 다음과 같은 몇 가지 장점이 있습니다.
- 단순한
- 빠르게
- 숫자 그룹화를 수학과 완전히 분리하여 유지하세요.
- 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