将 shell 脚本中的变量从字符串转换为数字

将 shell 脚本中的变量从字符串转换为数字

我有一个这样布局的文件

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但由于小数位的原因,这不起作用,我需要一个确切的答案。

有谁知道有什么解决方法吗?我是否走在正确的轨道上,或者我的处理方式是否存在根本问题?

答案1

shell 脚本根本没有数值变量,所以这不是问题。错误消息 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)

相关内容