在awk打印中有相等的空间



我有一个csv文件,内容如下:

"TELUS","Vancouver Canada","67.151","0.325","0","63247942","64210661","768241424","858087937"
"TELUS","Vancouver Canada","7.151","0.325","0","63247942","64210661","768241424","858087937"

在awk的帮助下,我成功地将它们解析为可读的格式。

awk -F, '{gsub(/"/, ""); printf "| %-11s | %-17s | %.1f %-6s | %.1f %-6s | %.1f %-6s | %.1f %-5.16s |n", $1, $2, $7/125000, "MB/s", $6/125000, "MB/s", ($8+$9)/(1000*1000*1000), "GB", $3, "ms" }'

返回这

| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 67.2 ms    |
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 7.2 ms    |

但是正如你所看到的,空间在延迟字段上是不相等的。我希望它是这样的。

| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 67.2 ms   |
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 7.2 ms    |
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 947.2 ms  |
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 7241.2 ms |

我在上面放了两个额外的字段,关键是无论延迟有多大,我都想保持列间距完整。如何做到这一点?

与其硬编码字段宽度,不如使用awk计算值,使用column计算宽度:

$ awk 'BEGIN{FS=OFS=","} {gsub(/"/, ""); printf ",%s,%s,%.1f MB/s,%.1f MB/s,%.1f GB,%.1f ms, n", $1, $2, $7/125000, $6/125000, ($8+$9)/(1000*1000*1000), $3}' file |
column -t -s',' -o' | ' | sed 's/^ //; s/ $//'
| TELUS | Vancouver Canada | 513.7 MB/s | 506.0 MB/s | 1.6 GB | 67.2 ms |
| TELUS | Vancouver Canada | 513.7 MB/s | 506.0 MB/s | 1.6 GB | 7.2 ms  |

但是如果你想在awk中进行格式化,那么再次将字段宽度(例如%-17s)与字段内容(例如舍入到%.1f)分开:

$ awk -F, -v CONVFMT='%.1f' '{gsub(/"/, ""); printf "| %-11s | %-17s | %-10s | %-10s | %-10s | %-10s |n", $1, $2, $7/125000 " MB/s", $6/125000 " MB/s", ($8+$9)/(1000*1000*1000) " GB", $3 " ms" }' file
| TELUS       | Vancouver Canada  | 513.7 MB/s | 506.0 MB/s | 1.6 GB     | 67.151 ms  |
| TELUS       | Vancouver Canada  | 513.7 MB/s | 506.0 MB/s | 1.6 GB     | 7.151 ms   |

try {%9.3f %-3.16s}:

echo "${a}" | mawk  '{ gsub(/[42]/,"")
printf "| %-11s | %-17s | %.1f %-6s | %.1f %-6s  "
"| %.1f %-6s | %9.3f %-3.16s |n",
$1        ,     $2,
$7 * 8E-6 , "MB/s",
$6 * 8E-6 , "MB/s", 
($8+$9)*(1E-9), "GB"  , $3, "ms" }' FS=','
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s    | 1.6 GB     |    67.151 ms  |
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s    | 1.6 GB     |     7.151 ms  |

您可以使用以下awk解决方案:

cat fmt.awk
{
gsub(/"/, "")
printf ("| %-11s | %-17s | %.1f %-6s | %.1f %-6s | %.1f %-6s | %-10s |n",
$1, $2, $7/125000, "MB/s", $6/125000, "MB/s", ($8+$9)/(1000*1000*1000),
"GB", sprintf("%.1f ms", $3))
}
awk -F, -f fmt.awk file.csv
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 67.2 ms    |
| TELUS       | Vancouver Canada  | 513.7 MB/s   | 506.0 MB/s   | 1.6 GB     | 7.2 ms     |

使用sprintf("%.1f ms", $3)得到$3后面跟着ms的小数点。这是在printf%-10s格式化,以获得左对齐输出与width=10

使用%10s格式使最后一列右对齐。

最新更新