良いここ私ファイル.csv引用符内の数字:
"0.2"
"0.3339"
"0.111111"
数字を小数点の3桁に丸めるには、次の解決策が有効です。
printf "%.03f\n" $(sed 's/\"//g' file.csv)
sed 's/\"//g' file.csv
しかし、今は変数として保存したいと思います。
var_sed=$(sed 's/\"//g' file.csv);
printf "%.03f\n" ${var_sed}
動作しません。出力は次のとおりです
zsh: bad math expression: operator expected at `0.3339\n0.1...'
0.000
だから問題var_sed
は。\n
printf "%.03f\n"
私が知っている唯一の解決策は次のとおりです。
var_sed=$(sed 's/\"//g' file.csv);
printf "%.03f\n" $(echo ${var_sed})
- たぶん、よりきれいな方法があるかもしれません。
printf "%.03f\n"
また、次の機能を追加したいと思います。
printf_function () { printf "%.03f\n" $1;}
しかし、これはうまくいきません。
printf_function () { printf "%.03f\n" $1;};
var_sed=$(sed 's/\"//g' file.csv);
printf_function ${var_sed}
動作しませんprintf_function $(echo ${var_sed})
。
______________________________________________________________
ファイルを変数に保存したいのはなぜですか? ______________________________________________________________
sed
問題は、実際にコマンドを関数に入れたいということです。申し訳ありません。問題を単純化するために変数にしました。
私のスクリプトは
sed_01 () { sed 's/\"$// ; s/^\"// ; s/something_else//g' $1;};
printf_03 () { printf "%.03f\n" $1;};
printf_03 "$(sed_01 file.csv)"
以下の説明で述べたように、bashで動作します。
出力:
"0.200"
"0.334"
"0.111"
しかしzshでは出力:例:
printf_03: bad math expression: operator expected at `0.3339\n0.1...'
0.000
答え1
printf "%.03f\n" $(sed 's/\"//g' file.csv) var_sed=$(sed 's/\"//g' file.csv); printf "%.03f\n" ${var_sed}
これは、数値を別々の引数として使用するトークン化に依存しますprintf
。問題は、zshが過去の愚かな残差で自動トークン化を放棄し、変数を拡張するためにこれを実行しないことです。ただし、何らかの理由でコマンドを置き換えるためにこれを行います。
コマンドオーバーライドで通常のスカラー変数に割り当てるときに分割もないため、出力の改行は変数に保存sed
されます。
これがコードでコマンド置換を使用できるが、中間変数は使用できない理由です。
変数の値を最初にロードする必要がある場合(単に印刷用のものではない場合)、次の点を考慮してください。配列(zsh)に保存します。:
lines=("${(f)$(sed 's/\"//g' file.csv)}")
printf "%.03f\n" $lines
readarray
Bashでは/を使用できますmapfile
。
mapfile -t lines < <(sed 's/\"//g' file.csv)
printf "%.03f\n" "${lines[@]}"
あるいは、どちらかに主に適用されることを望む場合は、再び単語スプレーに頼る必要があります。
lines=( $(sed 's/\"//g' file.csv) )
printf "%.03f\n" "${lines[@]}"
かっこに注意してください。配列を割り当てることによって単語の分離が再び発生します。(「メイン」には、動作に影響を与える修正に関する一般的な警告が含まれ、IFS
ファイル名のグロービングも発生します。)
もしそうなら、再びAWKを使ってこのようなことをする方が簡単かもしれません。
$ awk '{gsub(/"/, ""); printf "%.03f\n", $1}' file.csv
0.200
0.334
0.111