【问题标题】:How to add zero decimal points to all elements of a matrix in shell如何将零小数点添加到shell中矩阵的所有元素
【发布时间】:2019-08-23 00:20:07
【问题描述】:

我有一个包含整数和浮点数的文件,该文件有 3 列和多行。我希望所有数字都采用浮动格式,其中 6 个有效数字,即数字 2 变为 2.000000。我已经尝试过这个脚本,但它只适用于一列。如果您能帮助我如何将其用于接下来的两列或任何其他可以完成这项工作的单行脚本,我将不胜感激。提前致谢

awk '{printf "%.6f\n",$1}' file

【问题讨论】:

  • 如果您只打印$1(第一个字段),您为什么期望其他字段会发生变化。 for (i = 1; i < NF; i++) printf " %.6f", i; print ""
  • @DavidC.Rankin 不应该是$i,因为i 只会打印字段编号,而不是字段。
  • Doah....你是对的@Jotne,应该是$i(我一定一直在想for (i in ...)

标签: awk integer decimal floating


【解决方案1】:

您提供的脚本仅适用于一列,因为您只打印脚本中的第一列。如果您只有 3 列并且列数是固定的,则只需将其他两列添加到您的打印语句中即可。

例如:

awk '{printf "%.6f %.6f %.6f \n",$1,$2,$3}'

如果列数未知,您可以使用 awk 内的循环来打印所有列。 NF 将给出记录总数。您可以遍历它并打印结果。

awk '{ for (i=1; i<= NF; i++) printf "%.6f ",$i; print "" }' input

如果您的文件仅包含三列(NF 在这种情况下为 3),您也可以根据需要使用此脚本打印三列。

正如 cmets 中的 @kvantour 所指出的,编写上述一行代码的一种优雅方式是:

awk '{for(i=1;i<=NF;++i) printf "%.6f" (i==NF?ORS:OFS), $i} 

基本上,两个单行代码都做同样的事情,但ORS(输出记录分隔符)和OFS(输出字段分隔符)变量提供了轻松快速地更改输出的灵活性。

所以,(i==NF?ORS:OFS) 的作用是,如果字段不是最后一列,则打印 OFSOFS 默认为空格),如果是最后一列,则打印 ORSORS 的默认值为 newline )。使用这些分隔符变量的好处是,例如,如果您想在结果中的行之间有两个新行而不是一个换行符,可以使用ORS="\n\n" 轻松设置它

【讨论】:

  • @kvantour 感谢您指出这一点。编辑并更正了答案。
  • 虽然这个答案很好,但最好使用像 OFSORS 这样的变量来输出。这样,人们可以快速重新定义输出分隔符并实现相同的效果,或者将其合并到其他脚本中。也就是说,上面可以写成:awk '{for(i=1;i&lt;=NF;++i) printf "%.6f" (i==NF?ORS:OFS), $i}'
  • @kvantour 再次感谢。我已经用你提供的 cmets 更新了答案。
  • 谢谢大家。这很完美,解决了我的问题:)
  • 感谢@j23。我怎样才能接受答案?抱歉,我是这个网站的新手。
猜你喜欢
  • 1970-01-01
  • 2015-05-12
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多