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

时间:2015-04-14 17:43:03

标签: linux bash unix sed

我有一个文本文件,其中第四列包含带有许多小数位的数字。我需要将位数减少到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

4 个答案:

答案 0 :(得分:4)

awk '{printf "%s %s %s %.1f\n",$1, $2, $3, $4}' file > file2

输出到file2:

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

答案 1 :(得分:2)

带圆角的awk:

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

答案 2 :(得分:2)

这可能是你想要的:

$ 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

无论文件中有多少个字段,它都能正常工作。

答案 3 :(得分:1)

如果您只想在没有舍入的情况下剪切小数,可以使用sed

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

它会搜索一个或多个数字,后跟一个点和一个在捕获组中捕获的其他数字。以下可选数字,直到该行结束被扔掉。

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