여러 개의 30자리 숫자가 포함된 파일에서 처음 3개의 정수를 세고, 각 줄에서 처음 3개의 정수를 세어 합계를 출력합니다.

여러 개의 30자리 숫자가 포함된 파일에서 처음 3개의 정수를 세고, 각 줄에서 처음 3개의 정수를 세어 합계를 출력합니다.

여러 개의 30비트 길이 정수가 포함된 대용량 파일에서 처음 3개의 정수를 추출하고 처음 3개 숫자의 합을 출력하는 방법입니다. Linux 터미널에서?

답변1

각 줄의 처음 3자는 항상 숫자라고 가정 integers합니다 .digits

awk '{sum+=substr($0,1,3)} END{print sum+0}' file

답변2

perl -Mbigint -MList::Util=sum -lne '
  print sum(0, (/(?<!\d)\d{30}(?!\d)/g)[0..2])' < your-file

정확히 30개의 십진수를 포함하고 더 이상 숫자로 둘러싸여 있지 않은 처음 3개의 시퀀스를 찾아서 추가하고 결과를 출력합니다.

연속된 숫자가 3개 미만인 경우 가능한 한 많은 숫자를 합산하세요. 3개 이상의 숫자가 포함된 행에 대한 결과만 원하는 경우 다음과 같이 변경하세요.

perl -Mbigint -MList::Util=sum -lne '
  @numbers = /(?<!\d)\d{30}(?!\d)/g;
  print sum(0, @numbers[0..2]) if @numbers >= 3
  ' < your-file

답변3

Raku(이전 Perl_6) 사용

~$ raku -e 'my @a; repeat {get.match(:global, /\d**30/) ??  @a.push(~$/) !! next} until @a.elems == 3; @a.sum.put'   30_digits.txt

입력 예:

~$ raku -e 'for ^3 { put ([0..9].roll xx 30).join};' > 30_digits.txt
~$ cat 30_digits.txt
785624076726806242935676754394
801557051570803235347163971795
620594508808581496037051947969

예제 출력:

2207775637106190974319892674158

Raku의 이 답변은 처음 30자리 숫자를 읽고 합산합니다. "부사"(예: 매개변수) 의 경우 :global30자리 숫자가 어느 줄에서 나오는지는 중요하지 않습니다. "부사" 가 없으면 :global라쿠가 취합니다첫 번째각 줄은 30자리 숫자를 만나고 그러한 숫자 3개를 합산합니다.

위의 Raku 코드에는 "기본" 정규식만 포함되어 있으며, 물론 정규식은 왼쪽에서 오른쪽으로 읽기 때문에 30자리보다 긴 숫자는 오른쪽 끝에서 잘립니다. 물론 (오른쪽) 필드 구분 기호(예: CSV 파일의 쉼표)를 포함하여 일치를 향상시킬 수 있습니다. 인식 문제가 있는 경우 시도해 볼 수 있는 일반적인 정규식은 다음과 같습니다.

/ \D? \d**30 \D /

https://docs.raku.org/언어/regexes
https://raku.org

관련 정보