减少文本文件第四列中的小数

Decrease Decimals in Fourth Column In a Text File

我有一个文本文件,其中第四列包含有很多小数位的数字。我需要将位数减少到小数点后 0.1 位。

数据:

2015041416 KBOS TMP2M 62.034
2015041417 KBOS TMP2M 65.0826
2015041418 KBOS TMP2M 66.7278
2015041419 KBOS TMP2M 67.5033
2015041420 KBOS TMP2M 67.1731
2015041421 KBOS TMP2M 65.9252
2015041422 KBOS TMP2M 62.7644
2015041423 KBOS TMP2M 60.8136
2015041500 KBOS TMP2M 56.167
2015041501 KBOS TMP2M 55.7116
2015041502 KBOS TMP2M 51.8512
2015041503 KBOS TMP2M 51.6005
2015041504 KBOS TMP2M 50.1643
2015041505 KBOS TMP2M 49.2167
2015041506 KBOS TMP2M 48.273
2015041507 KBOS TMP2M 46.6407
awk '{printf "%s %s %s %.1f\n",, , , }' file > file2

输出到文件2:

2015041416 KBOS TMP2M 62.0
2015041417 KBOS TMP2M 65.1
2015041418 KBOS TMP2M 66.7
2015041419 KBOS TMP2M 67.5
2015041420 KBOS TMP2M 67.2
2015041421 KBOS TMP2M 65.9
2015041422 KBOS TMP2M 62.8
2015041423 KBOS TMP2M 60.8
2015041500 KBOS TMP2M 56.2
2015041501 KBOS TMP2M 55.7
2015041502 KBOS TMP2M 51.9
2015041503 KBOS TMP2M 51.6
2015041504 KBOS TMP2M 50.2
2015041505 KBOS TMP2M 49.2
2015041506 KBOS TMP2M 48.3
2015041507 KBOS TMP2M 46.6

使用 bash 和不使用 awk 的相同输出:

printf "%s %s %s %.1f\n" $(< file) > file2

如果你只是想去掉小数而不舍入你可以使用sed:

sed 's/\([0-9]\+\.[0-9]\)[0-9]*$//' input

它搜索一个或多个数字后跟一个点和一个捕获组中捕获的附加数字。直到行尾的以下可选数字被丢弃。

如果你需要四舍五入,sed不能这样做,因为它根本不支持数学计算。在这种情况下,我建议像其他建议的答案一样使用 awk

Awk 四舍五入:

awk '{printf("%d %s %s %.1f\n", , , , ) } ' file

这可能是您想要的:

$ awk '{$NF=sprintf("%.1f",$NF)}1' file
2015041416 KBOS TMP2M 62.0
2015041417 KBOS TMP2M 65.1
2015041418 KBOS TMP2M 66.7
2015041419 KBOS TMP2M 67.5
2015041420 KBOS TMP2M 67.2
2015041421 KBOS TMP2M 65.9
2015041422 KBOS TMP2M 62.8
2015041423 KBOS TMP2M 60.8
2015041500 KBOS TMP2M 56.2
2015041501 KBOS TMP2M 55.7
2015041502 KBOS TMP2M 51.9
2015041503 KBOS TMP2M 51.6
2015041504 KBOS TMP2M 50.2
2015041505 KBOS TMP2M 49.2
2015041506 KBOS TMP2M 48.3
2015041507 KBOS TMP2M 46.6

无论您在文件中有多少个字段,它都会起作用。