반응형
숫자 열을 합산하는 Bash 명령어
숫자 열을 합칠 수 있는 bash 명령어가 필요합니다.기본적으로 다음과 같은 작업을 수행할 수 있는 빠른 라이너 하나만 있으면 됩니다.
cat FileWithColumnOfNumbers.txt | sum
기존 파일 사용:
paste -sd+ infile | bc
stdin 사용:
<cmd> | paste -sd+ | bc
편집: 일부 붙여넣기 구현에서는 stdin에서 읽을 때 보다 명확하게 해야 합니다.
<cmd> | paste -sd+ - | bc
사용하는 옵션:
-s(점수) - 모든 행을 한 줄로 병합합니다.
-d - 기본이 아닌 구분 기호 사용(문자)
+
(이 경우는)
나는 선택된 답이 좋다.단, 작업에는 2개의 툴이 필요하기 때문에 awk보다 느린 경향이 있습니다.
$ wc -l file
49999998 file
$ time paste -sd+ file | bc
1448700364
real 1m36.960s
user 1m24.515s
sys 0m1.772s
$ time awk '{s+=$1}END{print s}' file
1448700364
real 0m45.476s
user 0m40.756s
sys 0m0.287s
다음 명령어는 모든 행을 추가합니다(awk 출력의 첫 번째 필드).
awk '{s+=$1} END {print s}' filename
두 줄이면 돼요?
awk '{ sum += $1; }
END { print sum; }' "$@"
불필요한 'cat' 없이 사용할 수 있습니다.
sum < FileWithColumnOfNumbers.txt
sum FileWithColumnOfNumbers.txt
FWIW: MacOS X에서는 원라이너로 할 수 있습니다.
awk '{ sum += $1; } END { print sum; }' "$@"
[고스트독74s 댓글 후속편]
bash-2.03$ uname -sr
SunOS 5.8
bash-2.03$ perl -le 'print for 1..49999998' > infile
bash-2.03$ wc -l infile
49999998 infile
bash-2.03$ time paste -sd+ infile | bc
bundling space exceeded on line 1, teletype
Broken Pipe
real 0m0.062s
user 0m0.010s
sys 0m0.010s
bash-2.03$ time nawk '{s+=$1}END{print s}' infile
1249999925000001
real 2m0.042s
user 1m59.220s
sys 0m0.590s
bash-2.03$ time /usr/xpg4/bin/awk '{s+=$1}END{print s}' infile
1249999925000001
real 2m27.260s
user 2m26.230s
sys 0m0.660s
bash-2.03$ time perl -nle'
$s += $_; END { print $s }
' infile
1.249999925e+15
real 1m34.663s
user 1m33.710s
sys 0m0.650s
bc(계산기)를 사용할 수 있습니다.#s 의 파일이 「n」이라고 하는 경우:
$ cat n
1
2
3
$ (cat n | tr "\012" "+" ; echo "0") | bc
6
그tr
모든 줄바꿈을 "+"로 변경하고 마지막 더하기 뒤에 0을 추가한 다음 식을 파이핑합니다( ).1+2+3+0
)를 계산기에 접속합니다.
또는 awk 또는 perl을 사용해도 괜찮다면 Perl 원라이너를 다음에 제시하겠습니다.
$perl -nle '$sum += $_ } END { print $sum' n
6
while read -r num; do ((sum += num)); done < inputfile; echo $sum
를 사용하다for
파일을 반복하다
sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
루비가 설치되어 있는 경우
cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)
언급URL : https://stackoverflow.com/questions/3096259/bash-command-to-sum-a-column-of-numbers
반응형
'programing' 카테고리의 다른 글
목표 C++란? (0) | 2023.04.11 |
---|---|
bash 탭 완료는 어떻게 작동합니까? (0) | 2023.04.11 |
공식에서 셀의 값을 셀 참조로 사용하는가? (0) | 2023.04.11 |
스토리보드의 사용자 지정 셀 행 높이 설정이 응답하지 않습니다. (0) | 2023.04.11 |
WPF에서는 Binding과 마찬가지로 TemplateBinding이 동작하지 않는 이유는 무엇입니까? (0) | 2023.04.11 |