파일의 숫자를 한 줄씩 합산해야 합니다.
문서:
1.0
0.46
0.67
합산한 다음 3으로 나누고 싶습니다.
나는 현재 다음을 가지고 있습니다:
while IFS= read -r var
do
x=$(($var + $x)) | bc -l
done < "file.txt"
echo "$x / 3"
내 실수:
-bash: 1.0 + 0: syntax error: invalid arithmetic operator (error token is ".0 + 0")
답변1
Bash/셸 산술은 부동 소수점 산술을 처리할 수 없습니다. 다음을 사용하여 작업을 수행할 수 있습니다 awk
.
awk '{sum= sum+$1} END {print sum/3}' file
그러면 파일을 읽고 각 줄을 에 추가합니다 sum
. 파일 읽기가 끝나면 sum
3으로 나눈 내용이 인쇄됩니다.
답변2
재미로
$ paste -sd+ file | dc -e2k0 -f- -e+3/p
.71
여기서 우리는dc
역광택계산기: 쓰고 싶은 숫자를 더하세요.
1.0 0.46 + 0.67 +
그러나 스택을 0( )으로 채워서 -e0
더 쉽게 만들 수 있습니다.
0 1.0+0.46+0.67 +
합계의 본문은 다음과 같이 간단히 생성할 수 있기 때문입니다 paste command
.
$ paste -sd+ file
1.0+0.46+0.67
마지막으로 합계의 마지막 접미사 +
와 접미사 나누기가 필요합니다. 이를 다른 -e
명령으로 작성할 수 있습니다(최종 결과를 인쇄하는 것을 잊지 마세요) -e+3/p
.
마지막 문제 중 하나는 dc
임의의 정밀도로 작동하지만 나눗셈의 기본값은 정밀도 0이므로 정수 결과가 반환된다는 것입니다. 스택에 푸시한 다음 스택에서 꺼내는 2k
명령을 사용하여 이를 변경할 수 있으며 결과를 사용하여 정밀도를 설정할 수 있습니다.2
함께 넣어보세요:
paste -sd+ file | dc -e2k0 -f- -e+3/p
답변3
이 시도:
x=0
while IFS= read -r var; do
x="$(echo "$var + $x" | bc -l)"
done < "file.txt"
echo "$x / 3" | bc -l
x
정의되지 않았습니다.- 이것이 작동하려면
echo
for가 필요합니다 (혼합 bash 산술이 아님).bc
답변4
숫자를 합산하면,numsum
num-utils
포장 에서이 작업을 한 번에 수행합니다.
x=$(numsum file.txt)
십진수를 행복하게 처리합니다.
numprocess
동일한 패키지에서 후속 파티셔닝을 수행하는 데 도움이 될 수 있습니다.
numsum file.txt | numprocess /%3/
%
numprocess
는 나눗셈을 표현하는 방법 이고 , 슬래시는 인수 구조에서 이상합니다.