【问题标题】:Remove space separator between awk printf / print删除 awk printf / print 之间的空格分隔符
【发布时间】:2017-07-27 15:50:52
【问题描述】:

以下命令将 disk_space_in_bytes 变量格式化为人类可读的输出,逗号后有 2 位数字。

echo $disk_space_in_bytes | awk '{ suffix=" KMGT"; for(i=1; $1>1024 && i < length(suffix); i++) $1/=1024; printf("%.2f\n", $1); print(substr(suffix, i, 1)"B")}'

(此 awk 命令归功于 @Innocent Bystander https://stackoverflow.com/a/36724130/6133648

例如,如果disk_space_in_bytes858 458 685,44(以字节为单位的值),则该命令将打印818.69 MB,但中间有一个空格。

我想删除这个多余的空格,例如818,69MB。但这在 awk 中对我来说有点棘手。我尝试了一些 ORS 和 OFS 操作,但没有成功。

你能找到去除多余空间的方法吗?

谢谢

【问题讨论】:

  • 另请参阅:stackoverflow.com/questions/15854332/…... 例如:numfmt --to=iec-i --suffix=B --format="%.2f" 858458685.44
  • 尝试了什么? StackOverflow 旨在帮助人们修复他们的编程代码。最好展示您失败的尝试,以便我们帮助您提高对awk et.al 的理解。 . 阅读stackoverflow.com/help/how-to-askstackoverflow.com/help/dont-askstackoverflow.com/help/mcve,并在此处发布更多问题之前使用tour。祝你好运。
  • @BenjaminW。后缀中的空格是针对disk_in_space_in_bytes小于1024的情况(见stackoverflow.com/a/36724130/6133648cmets)。
  • @shellter 正如我在原帖中所说,我尝试设置ORS=""(输出记录分隔符)和OFS=""(输出字段分隔符),希望抑制printf后的空格。它没有用,我觉得这可能不是实现这一目标的方法。我会看看这些链接,并记住你对我下一个问题的建议。谢谢。

标签: linux bash shell awk


【解决方案1】:

只需更改awk命令的参数,如下所示。目前,它在字节计数之后有一个额外的换行符,它还在" KMGT" 中打印一个空格,但该空格对于特定awk 命令显示正确的字节面额的方式是必要的。

此命令假定您使用的是gawk 变体,因为它使用gawk 特定函数gensub

echo $disk_space_in_bytes | awk '{ suffix=" KMGT"; for(i=1; $1>1024 && i < length(suffix); i++) $1/=1024; printf("%.2f", $1); print(gensub(/ /, "", "g", substr(suffix, i, 1))"B")}'

分段显示以使其更有意义:

echo $disk_space_in_bytes |
  awk '{
    suffix=" KMGT";
    for(i=1; $1>1024 && i < length(suffix); i++)
      $1/=1024;
    printf("%.2f", $1);
    print(gensub(/ /, "", "g", substr(suffix, i, 1))"B")
  }'

基本上,这里只有两个变化:

  • printf 命令中删除了换行符 (\n)
  • 此处使用的gensub 命令会从附加到字节面额的后缀中去除空格,如果它是字节而不是千字节等,则它是一个空格。

【讨论】:

  • @EdMorton 监督我,谢谢你提出这个问题。编辑了答案。
  • 换行符确实是罪魁祸首,感谢您注意到它。很适合 gensub。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多