파일에서 줄 번호를 합산하는 방법


24

다음과 같은 파일이 있습니다.

1
3
4
1
4
3
1
2

이 합계를 어떻게 찾을 수 있습니까 (예 : 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?


1
문맥 상, Stack Exchange API에서 Ask Ubuntu에있는 배지 수를 계산합니다.
Tim

cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]

지금은 API에 badge_count메소드 가 있음을 알고 있습니다.
Tim

API에서 배지를 계산하는 경우 API를 쿼리하는 데 사용하는 언어로는이 작업을 수행 할 수 없습니다 (python, javascript)?
Braiam 2016 년

답변:


41

bc구분 기호로 paste하나의 줄을 얻는 데 약간의 도움이 됩니다 +.

paste -sd+ file.txt | bc

grep정적 파일 대신 출력 (또는 다른 명령) 의 출력을 사용하려면 grep의 STDOUT을 다음의 STDIN에 전달하십시오 paste.

grep .... | paste -sd+ | bc

예:

% cat file.txt            
1
3
4
1
4
3
1
2

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

을 사용해야하는 경우 bash배열을 사용하여 파일 내용을 저장 한 다음 요소를 반복하거나 파일을 한 줄씩 읽고 각 줄에 대한 합계를 수행 할 수 있습니다. 두 번째 방법은 더 효율적입니다.

$ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
19

real    0m0.002s
user    0m0.000s
sys 0m0.000s

$ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
19

real    0m0.000s
user    0m0.000s
sys 0m0.000s

흠. 질문 변경 죄송합니다 : 한 줄처럼 내가 GREP 출력을 받아이를 수정할 수를 (또는 만들기 cat file.txt | bc?

@Tim

타, 그것은 간단했다!
Tim

2
stdin 방법은 내가 사용해야한다는 또 다른 대답을 발견 할 때까지 나에게 효과가 없었습니다 paste -sd+ -. 그것을 수정하십시오.
Xerus

19

awk도 사용할 수 있습니다. "hello"라는 단어가 포함 된 * .txt 파일 의 총 줄 수를 계산하려면 다음과 같이하십시오.

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

단순히 파일의 숫자를 합치려면 :

awk '{n += $1}; END{print n}' file.txt

그러나 해당 줄의 값이 "4"이면 4로 계산되지 않습니다. 1로 계산됩니다.
Tim

아니오, 그것은 4를 세게됩니다.
CrazyApe84

파일의 총 수를 원합니다. 이것이 그렇게합니까?
Tim

나는 당신이 당신의 질문을 grep의 출력으로 바꾸 었다고 생각했습니다. 나는 몇 가지 가정을하고 있었다. 파일의 값을 간단히 합하는 방법을 추가하겠습니다.
CrazyApe84

2
네. 실제로 heemayl과 같은 대답이지만 paste 및 bc 대신 awk를 사용하여 궁극적으로 더 많은 유연성을 제공합니다. 그럼에도 불구하고 그의 대답은 좋았으며 그는 먼저 투표를 할 자격이 있습니다!
CrazyApe84

7

numsum패키지에서 사용하십시오 num-utils!

(필요할 수도 있습니다 sudo apt-get install num-utils)

이 명령 numsum은 기본적으로 필요한 것을 수행합니다.

$ numsum file.txt 
19

다음에서 테스트 번호를 한 줄씩 읽으십시오 stdin.

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

또는 한 줄에서 읽습니다.

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19


더 많은 유틸리티

이 패키지에는 숫자 처리를위한 다른 유틸리티가 포함되어 있습니다.

numaverage   - find the average of the numbers, or the mode or median
numbound     - find minimum of maximum of all lines
numgrep      - to find numbers matching ranges or sets
numinterval  - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom    - random numbers from ranges or sets, eg odd.  
numrange     - similar to seq
numround     - round numbers up, down or to nearest

및 일반적인 계산 명령 numprocess,
즉, 입력 라인상의 숫자 명령 행 식을 적용한다.


1

awk라인 당 패턴으로 파일을 스캔하고 처리하는 데 유용한 기본 Linux 애플리케이션 인을 사용할 수 있습니다 . 귀하의 질문에, 이것은 당신이 원하는 것을 생산할 것입니다 :

awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt

파이프도 허용됩니다.

cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'

BEGIN{}블록이 필요 없습니다 . CrazyApe84의 답변을 참조하십시오 .
terdon

이 문제는 중복되지만 교훈적인 목적으로 포함시키는 것이 좋습니다.
gwarah 2016 년

그러나 그것은 무엇을 가르치는가? 모든 문제에 중복되며 awkC가 아니며 변수를 사용하기 전에 설정할 필요가 없습니다. 시도하십시오 awk 'BEGIN{print c+=1}'.
terdon

BEGIN {}블록은 변수를 초기화하기 위해 설계된 것이 아닙니다. 디자인 사양에 참여합니다. 따라서 일부 문제에서는 필요할 수 있습니다.
gwarah 2016 년

0

이것은 매우 간단한 bash스크립팅 사용입니다 .

SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done

이것은 현재 솔루션보다 훨씬 간단하고 툴셋을 최소화합니다.
Det

0

펄 솔루션 :

$ perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
19

위의 내용은 여러 파일의 모든 숫자를 합할 수 있습니다.

$ perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
34

개별 파일에서 숫자의 합계를 보려는 명령 줄에 제공된 여러 파일의 경우 다음을 수행 할 수 있습니다.

$ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt

0

단순-

awk '{total+=$1} END{print total}' file

숫자를 더하고 총계를 제공합니다.


0

간단한 접근 방식은 쉘의 내장 기능을 사용하는 것입니다.

SUM=0; while read N; do SUM=$((SUM+N)); done </path/to/file
echo $SUM

파일을 줄 단위로 읽고 결과를 합산하여 인쇄합니다.

파이프를 사용하고 첫 번째 행만 사용하려는 경우 다음과 같이 작동합니다.

SUM=0
your_command | while read -r LINE; do for N in $LINE; do break; done; SUM=$((SUM+N)); done
echo $SUM

첫 번째 요소를 얻는 방법은 다음과 같습니다.

LIST="foo bar baz"
for OBJ in $LIST; do break; done
echo $OBJ

foo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.