programing

숫자 열을 합산하는 Bash 명령어

goodsources 2023. 4. 11. 21:59
반응형

숫자 열을 합산하는 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

반응형