. csv
このデータはファイルにあります。
age,sex,bmi,smoker,region,charges
19,female,23.9,yes,southwest,16884.924
23,male,29.83,no,northeast,1725.5523
3番目の列(bmi)のいくつかのパターンに基づいて新しい列を作成したいと思います。
desnutrition='^([^,]*,){3}[1][0-7].[0-9]*'
low='^([^,]*,){3}[1][8-9].[0-9]*'
normal='^([^,]*,){3}[2][0-4].[0-9]*'
high='^([^,]*,){3}[2][5-9].[0-9]*'
obesity='^([^,]*,){3}[3-4][0-9].*'
希望の出力は次のとおりです。
age,sex,bmi,smoker,region,charges,bmi_level
19,female,23.9,yes,southwest,16884.924,normal
23,male,29.83,no,northeast,1725.5523,high
これを行う方法はありますか(好ましくはbashまたはawkを使用)。
ベストアンサー1
あなたの正規表現を正しく理解したら、これはあなたが望むものだと思います。
$ cat tst.awk
BEGIN { FS=OFS="," }
NR == 1 {
level = "bmi_level"
}
NR > 1 {
bmi = $3
if ( bmi >= 30 ) { level = "obese" }
else if ( bmi >= 25 ) { level = "high" }
else if ( bmi >= 20 ) { level = "normal" }
else if ( bmi >= 18 ) { level = "low" }
else { level = "desnutrition" }
}
{ print $0, level }
$ awk -f tst.awk file
age,sex,bmi,smoker,region,charges,bmi_level
19,female,23.9,yes,southwest,16884.924,normal
23,male,29.83,no,northeast,1725.5523,high
これが完全に正確でない場合は、数値を調整する方法が明らかであることを願っています。