printf "%.3f" ${改行文字を含む変数} - エラー\n

printf

良いここファイル.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は。\nprintf "%.03f\n"

私が知っている唯一の解決策は次のとおりです。

var_sed=$(sed 's/\"//g' file.csv);
printf "%.03f\n" $(echo ${var_sed})
  1. たぶん、よりきれいな方法があるかもしれません。
  2. 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

readarrayBashでは/を使用できます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

おすすめ記事