You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:42:29