Bash如何根据列最大长度动态填充空格
动态设置列宽格式化输出
问题修正与思路
你当前的col_length数组是列号和长度交替存入的结构,不方便直接按列号获取对应长度。首先要调整数组存储逻辑,让列号作为索引,对应值为该列的最大长度;再把这些长度信息传递给awk,让它动态生成格式化字符串,替换固定的%-14s。
完整修改代码
# Collect the max size of each column and stored in col_length declare -A col_length # 用关联数组,列号直接映射对应长度 total_cols=$(head -n1 "$tmp_file" | awk -F '::' '{print NF}') for (( col=1; col<=total_cols; col++ )); do length=$(get_column_size "$col") col_length[$col]=$length # 列号为索引,存储对应列的最大长度 done # 拼接列长度规格字符串,传给awk cols_spec="" for (( col=1; col<=total_cols; col++ )); do cols_spec+="${col}:${col_length[$col]}," done cols_spec=${cols_spec%,} # 移除末尾多余的逗号 # Print with dynamic formatting while read -r line; do echo "$line" | awk -F'::' -v spec="$cols_spec" ' BEGIN { # 拆分规格字符串到len数组,len[列号] = 对应长度 split(spec, arr, ",") for (k in arr) { split(arr[k], pair, ":") len[pair[1]] = pair[2] } } { for(i=1; i<=NF; i++){ # 动态生成格式化字符串,用当前列的最大长度填充 printf "|%-" len[i] "s", $i } print "" # 打印换行符 }' done < "$tmp_file"
修改说明
- 数组存储优化:改用关联数组
col_length,直接通过列号(如col_length[1])获取第一列的最大长度,避免原数组交替存储结构带来的解析麻烦。 - 传递长度信息给awk:将列号和长度拼接成
列号:长度的逗号分隔字符串,通过-v参数传给awk,解决awk无法直接读取bash数组的问题。 - 动态格式化:在awk内部拆分规格字符串得到各列长度,构造
|%-len[i]s的动态格式,实现按列最大长度自动填充空格。 - 性能优化:把
cat $tmp_file | while read line改为while read line < "$tmp_file",减少不必要的子进程。
内容的提问来源于stack exchange,提问作者pavan kumar
相关产品推荐
相关产品推荐

