印刷機能

印刷機能

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

ループ内のアクションは、指定された正規表現の一致(一致する場合)の末尾の数字を切り捨てます。

おすすめ記事