Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 减少文本文件第四列中的小数_Linux_Bash_Unix_Sed - Fatal编程技术网

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

Linux 减少文本文件第四列中的小数,linux,bash,unix,sed,Linux,Bash,Unix,Sed,我有一个文本文件,其中第四列包含许多小数位的数字。我需要把位数减少到小数点后0.1位 数据: 输出到文件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 201504

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

数据:

输出到文件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 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 2015041501kbos 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
printf“%s%s%s%.1f\n”$(file2

如果您只想在不舍入的情况下减少小数,可以使用
sed

sed 's/\([0-9]\+\.[0-9]\)[0-9]*$/\1/' input
它搜索一个或多个数字,后跟一个点和一个捕获组中捕获的附加数字。以下可选数字直到行尾被丢弃

如果需要取整,
sed
无法执行此操作,因为它根本不支持数学计算。在这种情况下,我建议像其他建议的答案一样使用
awk

awk加舍入:

awk '{printf("%d %s %s %.1f\n", $1, $2, $3, $4) } ' 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

无论文件中有多少字段,它都会工作。

准确地说。我需要将大量的小数舍入到第十位(例如0.1)。@AaronPerry你刚才说需要舍入,但这个解决方案舍入了。想想你真正想要的是什么。当
62.7644
变成
62.7
62.8
时,“减少”是什么意思?换句话说,你是想截断、向上取整、向下取整还是其他什么?
awk '{printf("%d %s %s %.1f\n", $1, $2, $3, $4) } ' 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