40,000行のファイルがあります。
head flower_all
0.992957746478873 0.00704225352112677
0.646410833917366 0.353589166082634
0.992957746478873 0.00704225352112677
0.992957746478873 0.00704225352112677
0.992957746478873 0.00704225352112677
0.992957746478873 0.00704225352112677
0.992957746478873 0.00704225352112677
0.992957746478873 0.00704225352112677
0.5 0.5
有効数字3個だけ維持したいと思います。私が望む出力:
0.992 0.007
0.646 0.353
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.5 0.5
どうすればいいですか?
ベストアンサー1
そしてawk
:
awk '{ printf("%.3g %.3g\n", $1, $2) }' file
データを考慮すると、これは次のようになります。
0.993 0.00704
0.646 0.354
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.993 0.00704
0.5 0.5
0.00704には小数点以下5桁がありますが、有効数字は3つです。
正確に小数点以下の3桁が必要な場合は、代わり%.3f
に使用し%.3g
て取得してください。
0.993 0.007
0.646 0.354
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.993 0.007
0.500 0.500
上記の2つのバリエーションは、GNUを使用して可変数の列に一般化できますawk
。
awk -v CONVFMT='%.3g' '{ for (i=1; i<=NF; ++i) $i+=0; print }' file
ループは各フィールドの値を$i+=0
浮動awk
小数点に再フォーマットし、それを考慮しますCONVFMT
(同等の操作を実行します$i=sprintf(CONVFMT, $i)
)。
欲しいなら切る数字:
awk '{ for (i=1; i<=NF; ++i) $i=sprintf("%.5s", $i); print }' file
これは数字を文字列として扱い、5文字以降から切り捨てます(すべての数字が10未満、0より大きいと仮定)。
0.992 0.007
0.646 0.353
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.992 0.007
0.5 0.5
より一般的な数字の切り捨ての場合:
awk '{ for (i=1; i<=NF; ++i) if (match($i,".*\\.[0-9]?[0-9]?[0-9]?")) $i=substr($i,RSTART,RLENGTH); print }' file
ループ内のアクションは、指定された正規表現の一致(一致する場合)の末尾の数字を切り捨てます。