쉘 스크립트에서 변수를 문자열에서 숫자로 변환

쉘 스크립트에서 변수를 문자열에서 숫자로 변환

이렇게 정리된 파일이 있어요

gender,yearsExperience,yearsSchool,wage
female,9,13,6.3152956461
female,12,12,5.4797699786
female,11,11,3.6421699174
female,9,14,4.5933365997
female,8,14,2.4181574607

고등학교 졸업자와 대학 졸업자(12/16학년)의 최저임금 차이를 구하려고 합니다. 다음과 같이 작성된 쉘 스크립트가 있습니다.

#High School Min
HighSchoolMin=$(cat wages.csv | cut -d "," -f 3,4 | egrep "^[1]{1}[2]{1}," | tr , " " | sort -k2,2r | tail -n 1 | cut -d " " -f 2)

#College Min
CollegeMin=$(cat wages.csv | cut -d "," -f 3,4 | egrep "^[1]{1}[6]{1}," | tr , " " | sort -k2,2r | tail -n 1 | cut -d " " -f 2)

Difference=$($CollegeMin-$HighSchoolMin | bc)

echo The difference in minimum wages between high school and college graduates is $Difference.

내가 bash this.script얻을 때line 13: 10.128063739-0.1028907398: command not found

변수를 숫자값이 아닌 문자열로 취급하기 때문인 것 같습니다. 이것을 시도했지만 declare -i소수점 이하 자릿수로 인해 작동하지 않으며 정확한 답변이 필요합니다.

누구든지 해결책을 알고 있습니까? 내가 올바른 길을 가고 있는 걸까요, 아니면 이 일을 진행하는 방식에 근본적인 문제가 있는 걸까요?

답변1

쉘 스크립트에는 숫자 변수가 전혀 없으므로 문제가 되지 않습니다. 오류 메시지는 100% 정확합니다. 10.128063739-0.1028907398은 명령이 아닙니다. bc로 전송되는 출력을 생성하려면 명령이 필요합니다.

노력하다:

Difference=$(echo "$CollegeMin-$HighSchoolMin" | bc)

대신에

답변2

@davolfman이 필요한 답을 갖고 있는 것 같습니다.

참고로, 급여 캡처 그룹과 함께 정규식을 사용하여 고등학교 졸업(12학년) 및 대학 졸업(16학년) 급여 검색을 최적화할 수 있습니다.

sed 's/^[^,]*,[^,]*,12,\(.*\)/\1/;t;d' wages.csv # High School Grad Wages
sed 's/^[^,]*,[^,]*,16,\(.*\)/\1/;t;d' wages.csv # College Grad Wages

HighSchoolMin 및 CollegeMin의 업데이트 스크립트는 다음과 같습니다.

HighSchoolMin=$(sed 's/^[^,]*,[^,]*,12,\(.*\)/\1/;t;d' wages.csv | sort -n | head -1)
CollegeMin=$(sed 's/^[^,]*,[^,]*,16,\(.*\)/\1/;t;d' wages.csv |sort -n | head -1)

관련 정보