【问题标题】:awk rounding the float numbersawk 舍入浮点数
【发布时间】:2017-05-02 18:39:08
【问题描述】:

我的文件 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. 它正在对数字进行四舍五入,我需要按原样打印小数

我该如何解决这个问题?

【问题讨论】:

  • 你为什么指定NR>-1
  • 为什么要设置两次OFS?
  • 是数字 5.986627e738 使用科学记数法或拼写错误,e 不应该在那里?
  • @SatyanveshMuppaneni 您应该添加预期输出以清除一些疑问,例如在第五列中使用eNR>-1 等...如果第五列总是有.awk 'BEGIN {FS=OFS=","} {split($5,a,"."); a[1]+=10; $5=a[1]"."a[2]}1' input_file 可能会起作用
  • @Kent 是的,只增加 int ... OP 的值类似于 5.986627e738 ... 随着您的回答,它会转换为 10.0000000000 因此 cmets 要求 OP 澄清

标签: bash awk


【解决方案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

【讨论】:

  • 它与@123 的答案有何不同?
  • @RomanPerekhrest 当我发布它时,他的答案没有出现。我想我解释了为什么 OP 的解决方案不起作用并提出了一些建议。
  • 解释-是,awk表达式--否(抄袭)
  • @RomanPerekhrest 根据 OP 的评论,现在我的答案与 123 不同。现在可以了吗?
  • 现在好多了
【解决方案2】:

你所做的是替换整张唱片,你真正想做的是

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

【讨论】:

  • 这如何解决他们的第二个问题?
  • 谢谢,karakfa,我需要在这方面做一些工作以合并到我的脚本中,看看是否有任何问题。给我一些时间我会回来的
  • 感谢您的支持
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多