Linux column工具用法咨询:换行文本转N列表格的原生Shell方案
换行文本转N列表格的原生Shell/Linux解决方案
问题场景
输入文件input.txt内容:
One Two Three Four Five Six
期望输出2列表格(左对齐,自动补空格):
One Two Three Four Five Six
尝试过的工具问题:
column:无参数输出和cat一致;column -t会把所有内容挤在同一行,无法生成多列。pr -t --columns 2:输出接近需求,但内容含空格时会出现对齐偏移,且无更多调整选项。
解决方案
方法1:用awk实现通用N列表格(无临时文件)
awk是Linux系统默认预装工具,可实现任意列数的格式化输出,自动计算最大列宽并对齐:
# 替换cols=2为目标列数,input.txt为你的文件名 awk -v cols=2 ' { lines[++n] = $0 } END { # 计算所有行的最大长度,用于对齐 max_len = 0 for (i=1; i<=n; i++) { len = length(lines[i]) if (len > max_len) max_len = len } # 计算每列需要容纳的行数(向上取整) rows = (n + cols - 1) / cols # 逐行输出多列内容 for (i=1; i<=rows; i++) { output = "" for (j=0; j<cols; j++) { current_idx = i + j*rows if (current_idx <= n) { # 左对齐,补空格到最大宽度 output = output sprintf("%-" max_len "s", lines[current_idx]) } } print output } }' input.txt
方法2:split + paste + column(适合快速实现)
通过split将原文件拆分为N个等长(或近似等长)的临时文件,再用paste合并为多列,最后用column对齐:
# 生成2列的示例,修改2为目标列数,input.txt为你的文件名 file="input.txt" cols=2 total_lines=$(wc -l < "$file") # 计算每个临时文件的行数(向上取整) lines_per_col=$(( (total_lines + cols - 1) / cols )) # 拆分文件 split -l "$lines_per_col" "$file" tmp_col_ # 合并并对齐 paste tmp_col_* | column -t # 清理临时文件 rm tmp_col_*
说明
- 方法1无需生成临时文件,逻辑更灵活,适合处理任意行数的文件,且能保证列对齐不受内容空格影响。
- 方法2依赖系统基础工具,命令更简洁,但需要处理临时文件,适合快速验证需求。
内容的提问来源于stack exchange,提问作者user22335954
相关产品推荐
相关产品推荐

