csvの多くの値を小数点以下3桁に丸めます(printf?)

csvの多くの値を小数点以下3桁に丸めます(printf?)

次のような貼り付けコマンドがあります。 paste -d , file1.csv file2.csv file3.csv

file2.csv には次の数字が含まれています。

0.2
0.3339
0.111111

file2.csvの値に、次のように小数点以下の3桁を含めたいと思います。

0.200
0.334
0.111

値の場合、次のように動作します。

printf "%.3f" "0.3339"->0.334

しかし、これはfile2.csvの複数の値に対しては機能しません。

paste -d , file1.csv <(printf %s "%.3f" "$(< file2.csv)") file3.csv

たぶん良い解決策がありますか?

ベストアンサー1

numfmtここで役に立つGNU coreutilsツールバーの一部であるGNU UtilitiesというGNUユーティリティがあります。数値の書式を指定できます。次のコマンドは、書式文字列(「小数点の3桁までの精度を持つ浮動小数点値」)をfile2.csv使用して、すべての値を書式設定します。フォーマットされた値は標準出力に印刷されます。printf%.3f

$ numfmt --format=%.3f <file2.csv
0.200
0.334
0.112

ご覧のとおり、デフォルトでは「0から始まる」丸めを使用しますが、次のように変更できます--round=nearest

$ numfmt --format=%.3f --round=nearest <file2.csv
0.200
0.334
0.111

paste次のように、プロセス置換を使用してコマンドに挿入できます。

paste -d , file1.csv <( numfmt --format=%.3f --round=nearest <file2.csv ) file3.csv

ファイルが「単純」でないCSVの場合、つまり引用符付きフィールドを含めることができる場合は、CSV認識ツールを使用する必要があります。ミラーmlr)データ処理。上記の2番目の例は、Miller式numfmt(形式文字列を使用)の関数を使用して以下で再生成されます。fmtnum()putprintf

$ mlr --csv -N put '$1 = fmtnum($1, "%.3f")' file2.csv
0.200
0.334
0.111

および--csvオプションを使用すると、-NMillerはヘッダーなしのCSVで入力を読み込み、出力を書き込むことができます。

おすすめ記事