正規表現一致で新しい列を作成する

正規表現一致で新しい列を作成する

. 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

これが完全に正確でない場合は、数値を調整する方法が明らかであることを願っています。

おすすめ記事