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

如何用awk重排文件列?现有脚本输出单列问题求助

用AWK实现列重排的正确方法

你的原脚本问题在于循环调用awk单独打印每一列,然后追加到文件,这会把所有列内容拆成单行输出,自然都挤到同一列里了。下面是两种用awk一次处理完成列重组的方案:

针对120列的固定写法

120列对应30组A/B/C/D(每组4列),可以直接指定列的顺序:

awk '{
    # 输出所有A类列(第1、5、9...117列)
    printf "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s ", $1,$5,$9,$13,$17,$21,$25,$29,$33,$37,$41,$45,$49,$53,$57,$61,$65,$69,$73,$77,$81,$85,$89,$93,$97,$101,$105,$109,$113,$117;
    # 输出所有B类列(第2、6、10...118列)
    printf "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s ", $2,$6,$10,$14,$18,$22,$26,$30,$34,$38,$42,$46,$50,$54,$58,$62,$66,$70,$74,$78,$82,$86,$90,$94,$98,$102,$106,$110,$114,$118;
    # 输出所有C类列(第3、7、11...119列)
    printf "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s ", $3,$7,$11,$15,$19,$23,$27,$31,$35,$39,$43,$47,$51,$55,$59,$63,$67,$71,$75,$79,$83,$87,$91,$95,$99,$103,$107,$111,$115,$119;
    # 输出所有D类列(第4、8、12...120列),最后换行
    print $4,$8,$12,$16,$20,$24,$28,$32,$36,$40,$44,$48,$52,$56,$60,$64,$68,$72,$76,$80,$84,$88,$92,$96,$100,$104,$108,$112,$116,$120;
}' input.txt > output.txt

通用适配版(支持任意数量的A/B/C/D组)

如果后续列数有变化,用循环动态生成列顺序更灵活:

awk '{
    line = ""
    # 先拼接所有A列:从第1列开始,每4列取一个
    for (i=1; i<=NF; i+=4) {
        line = line $i " "
    }
    # 拼接所有B列:从第2列开始,每4列取一个
    for (i=2; i<=NF; i+=4) {
        line = line $i " "
    }
    # 拼接所有C列:从第3列开始,每4列取一个
    for (i=3; i<=NF; i+=4) {
        line = line $i " "
    }
    # 拼接所有D列:从第4列开始,每4列取一个
    for (i=4; i<=NF; i+=4) {
        line = line $i " "
    }
    # 去掉末尾多余的空格,再输出整行
    sub(/ $/, "", line)
    print line
}' input.txt > output.txt

注意事项

  • 不需要用sed -i '1d'删除表头,上面的脚本会自动处理表头行,保持列名和数据的对应关系。
  • 两种方案都是一次调用awk完成处理,避免了多次IO操作,效率更高,也不会破坏行结构。

内容的提问来源于stack exchange,提问作者Kay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:27:34