Bash

將 shell 腳本中的變數從字元串轉換為數字

  • October 9, 2019

我有一個像這樣佈置的文件

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 年學校)所賺取的最低工資之間的差異。我有一個編寫如下的shell腳本:

#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了,但由於小數位,這不起作用,我需要一個準確的答案。

有誰知道任何解決方法?我是在正確的軌道上,還是我如何處理這個問題只是一個基本問題?

Shell 腳本根本沒有數值變數,所以這不是問題。錯誤消息 100% 正確 10.128063739-0.1028907398 不是命令,您需要一個命令來創建輸出以發送到 bc。

嘗試:

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

反而

我看到@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)

引用自:https://unix.stackexchange.com/questions/545981