awk舍入浮点数

时间:2017-05-02 08:51:13

标签: bash awk

我的第一行文件a.txt包含以下内容,字段由(,)

分隔
ab,b1,c,d,5.986627e738,e,5.986627e738
cd,g2,h,i,7.3423542344,j,7.3423542344
ef,l3,m,n,9.3124234323,o,9.3124234323

当我发出以下命令时

awk -F"," 'NR>-1{OFS=",";gsub($5,$5+10);OFS=",";print }' a.txt

正在打印

ab,b1,c,d,inf,e,inf
cd,g2,h,i,17.3424,j,17.3424
ef,l3,m,n,19.3124,o,19.3124

这里我有两个问题

  1. 我要求awk将10添加到第5列,但由于重复的条目,它已添加到第7列

  2. 这是对数字进行四舍五入,相反,我需要小数才能打印

  3. 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

awk 'BEGIN {FS=OFS=","}{$5=sprintf("%.10f", $5+10)}7' file
  • 在您的数据中,#1行中的$ 5有一个e,因此在输出中变为10.0000 ....
  • 您使用gsub替换,因此所有匹配项都将被替换。
  • printf / sprintf应被视为以特定格式输出。

用gawk测试

如果要动态设置printf格式:

kent$  cat f
ab,b1,c,d,5.9866,e,5.986627e738
cd,g2,h,i,7.34235,j,7.3423542344
ef,l3,m,n,9.312423,o,9.3124234323

kent$  awk 'BEGIN {FS=OFS=","}{split($5,p,".");$5=sprintf("%.*f",length(p[2]), $5+10)}7' f
ab,b1,c,d,15.9866,e,5.986627e738
cd,g2,h,i,17.34235,j,7.3423542344
ef,l3,m,n,19.312423,o,9.3124234323

答案 1 :(得分:0)

你所做的就是替换整个记录,你真正想做的是

awk 'BEGIN {FS=OFS=","} 
           {$5+=10}1' a.txt