我有一個包含以下內容的 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 |
我在上面添加了兩個額外的欄位,關鍵是無論延遲有多大,我都希望保持列間距不變。這該怎么做?
uj5u.com熱心網友回復:
試試{ %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 |
uj5u.com熱心網友回復:
而不是硬編碼欄位寬度,只需用于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 |
uj5u.com熱心網友回復:
您可以使用此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. 這是在 main 中格式化的,printf使用%-10s格式化以獲得左對齊的輸出width=10。
要使最后一列右對齊,請使用s格式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473101.html
