2

我有一个文件包含多行数据,如下所示。

$cat out.txt

342000,0,6.768619883040936,5.834888120763486,12211.2329060592,14437.0
342001,1,7.768619883040937,6.834888120763487,12212.2329060593,14438.1
........
........

我需要重新格式化数据并更新相同的文件。

342000,0,6.769,5.835,12211,14437
342001,1,7.769,6.835,12212,14438

必需的;

  1. 第 3 列的值四舍五入到小数点后 3 位
  2. 第 4 列值四舍五入到小数点后 3 位
  3. 第 5 列值的四舍五入
  4. 第 6 列值的四舍五入

感谢您的支持

4

3 回答 3

3

您可以使用awkwith printf,如下所示:

$ awk -F, '{printf("%d,%d,%.3f,%.3f,%.0f,%.0f\n",$1,$2,$3,$4,$5,$6)}' file
342000,0,6.769,5.835,12211,14437
342001,1,7.769,6.835,12212,14438
于 2013-07-02T08:34:35.823 回答
1

如果您想完全在 bash 中执行此操作(printf是内置的),您可以执行以下操作:

#!/bin/bash

IN=$1

(
    IFS=','
    while read line ; do
        set $line XXX
        if [ $1 != "XXX" ] ; then
            printf "%d,%d,%.3f,%.3f,%.0f,%.0f\n" "$1" "$2" "$3" "$4" "$5" "$6"
        fi
    done
) < $IN
于 2013-07-02T08:41:40.360 回答
1

这可以简化,还要注意在正确的语言环境中设置小数点分隔符。

export LANG=C

你可以做这样的事情(知道你输入的格式是固定的)

IFS=","
while read line;do printf "%d,%d,%.3f,%.3f,%.0f,%.0f\n" $line ; done < out
于 2013-07-02T08:46:29.410 回答