다음과 같은 파일이 있습니다.
1
3
4
1
4
3
1
2
이 합계를 어떻게 찾을 수 있습니까 (예 : 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
메소드 가 있음을 알고 있습니다.
다음과 같은 파일이 있습니다.
1
3
4
1
4
3
1
2
이 합계를 어떻게 찾을 수 있습니까 (예 : 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
메소드 가 있음을 알고 있습니다.
답변:
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
cat file.txt | bc
?
paste -sd+ -
. 그것을 수정하십시오.
awk도 사용할 수 있습니다. "hello"라는 단어가 포함 된 * .txt 파일 의 총 줄 수를 계산하려면 다음과 같이하십시오.
grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'
단순히 파일의 숫자를 합치려면 :
awk '{n += $1}; END{print n}' file.txt
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
,
즉, 입력 라인상의 숫자 명령 행 식을 적용한다.
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의 답변을 참조하십시오 .
awk
C가 아니며 변수를 사용하기 전에 설정할 필요가 없습니다. 시도하십시오 awk 'BEGIN{print c+=1}'
.
BEGIN {}
블록은 변수를 초기화하기 위해 설계된 것이 아닙니다. 디자인 사양에 참여합니다. 따라서 일부 문제에서는 필요할 수 있습니다.
이것은 매우 간단한 bash
스크립팅 사용입니다 .
SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
펄 솔루션 :
$ 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
간단한 접근 방식은 쉘의 내장 기능을 사용하는 것입니다.
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