Bash循环中如何格式化站点对距离输出实现整齐排版?
让Bash循环输出的站点信息列对齐的解决方案
嘿,这个问题我太懂了!用echo输出变量的时候,因为每个字段的长度不一样,很容易就歪歪扭扭的。要搞定列对齐,printf命令是你必须掌握的工具——它能精准控制每个字段的宽度和格式,完美解决这个问题。
核心思路:用printf格式化输出
把你原来的echo语句替换成printf,给每个字段指定固定宽度(可以根据实际数据长度调整),就能让所有行的对应列自动对齐。
比如针对你的需求,我们可以这样写:
# 先输出表头(可选,但让输出更清晰) printf "%-18s %-5s | %-18s %-5s | %-20s %-10s\n" "Station" "Code" "Station" "Code" "Degrees" "KM" printf "%s\n" "-----------------------------------------------------------------------------" # 你的for循环主体(这里用示例变量模拟迭代过程) for station1 in "Beijing West" "Shanghai Hongqiao" "Guangzhou South"; do code1=$(echo "$station1" | awk '{print substr($0,1,3)}' | tr '[:lower:]' '[:upper:]') station2="Shenzhen North" code2="SNH" c=$(echo "scale=2; $RANDOM%20+10" | bc) # 模拟距离数值 km=$(echo "$c * 111.2" | bc -l) # 关键的格式化输出语句 printf "%-18s (%3s) | %-18s (%3s) | distance=%6.2f degrees or %7.2f km\n" \ "$station1" "$code1" "$station2" "$code2" "$c" "$km" done
格式符说明
这里给你拆解一下用到的格式符,方便你根据自己的数据调整:
%-18s:左对齐的字符串,占18个字符宽度(如果站点名称更长,就把18改成更大的数)(%3s):代码字段占3个字符宽度,括号包裹%6.2f:浮点数,总宽度6位,保留2位小数(确保度数列对齐)%7.2f:公里数的浮点数格式,总宽度7位,保留2位小数
效果示例
运行上面的代码,输出会是整整齐齐的:
Station Code | Station Code | Degrees KM ----------------------------------------------------------------------------- Beijing West (BEI) | Shenzhen North (SNH) | distance=12.34 degrees or 1372.21 km Shanghai Hongqiao (SHA) | Shenzhen North (SNH) | distance=18.90 degrees or 2101.68 km Guangzhou South (GUA) | Shenzhen North (SNH) | distance=10.56 degrees or 1174.27 km
进阶技巧(动态适配宽度)
如果你的站点名称长度差异很大,不想手动算最大宽度,可以先遍历所有数据,找出每个字段的最长长度,再动态生成printf的格式字符串。不过对于大多数场景,固定宽度已经足够好用啦。
内容的提问来源于stack exchange,提问作者Sayan Roy
相关产品推荐
相关产品推荐

