このように整理されたファイルがあります。
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)