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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:23:21