删除awk printf / print之间的空格分隔符

时间:2017-07-27 15:50:53

标签: linux bash shell awk

以下命令将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操作但没有成功。

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

由于

1 个答案:

答案 0 :(得分:3)

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

此命令假定您使用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")
  }'

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

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