如何用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
相关产品推荐
相关产品推荐

