从列中减去常量值而不进行舍入

时间:2014-05-21 00:43:48

标签: perl shell awk

我有这样的文件。

Column1 Column2 
-3500 value1
-3480 value2
-3460 value 3
9920 value 50
9940
9960
10000
10020
40000 Last value

看看这个例子:

awk 'NR>1{$1=$1-4.91}1' file
Column1 Column2
-3504.91 value1
-3484.91 value2
-3464.91 value 3
9915.09 value 50
9935.09
9955.09
9995.09
10015.1
39995.1 Last value

我想拥有正确的值,而不是这样的四舍五入:

Column1 Column2
-3504.91 value1
-3484.91 value2
-3464.91 value 3
9915.09 value 50
9935.09
9955.09
9995.09
10015.09
39995.09 Last value

我试图从第一列中减去常量值4.91。一切正常,直到9980,但从10000开始,awk仅从数据中减去4.9,并使值0.01小于原始值。我认为它是四舍五入的最多一些小数位,但我不想要舍入值。任何人都可以建议我解决方法..

欢迎来自shell脚本或Perl的任何其他建议。

3 个答案:

答案 0 :(得分:2)

可以在perl中完成:

perl -pe 's/^([-0-9]+)/$1 - 4.91/e' your_file

详细说明:

  • -p逐行读取文件并将其打印
  • -e运行包含$_
  • 行内容的perl代码
  • s/.../.../e - 用表达式替换regexp
    • ^([-0-9]+) - 匹配任何数字和/或-符号。还捕获匹配的片段。
    • $1 - 4.91 - 使用regexp捕获的值进行工作。

答案 1 :(得分:0)

以下是使用awk执行此操作的方法:
您只需使用printf函数设置您喜欢的小数。

awk 'NR>1{printf "%.2f\n",$1-4.91}' file
-3504.91
-3484.91
-3464.91
9915.09
9935.09
9955.09
9995.09
10015.09
39995.09

答案 2 :(得分:0)

$ awk 'BEGIN{CONVFMT="%.2f"} NR>1{$1=$1-4.91}1' file
Column1 Column2
-3504.91 value1
-3484.91 value2
-3464.91 value 3
9915.09 value 50
9935.09
9955.09
9995.09
10015.09
39995.09 Last value

或者如果您愿意:

$ awk 'NR>1{$1=sprintf("%.2f",$1-4.91)}1' file
Column1 Column2
-3504.91 value1
-3484.91 value2
-3464.91 value 3
9915.09 value 50
9935.09
9955.09
9995.09
10015.09
39995.09 Last value