使用BASH将制表符分隔表按列分块
按列拆分制表符分隔文件的解决方案
split命令确实仅支持按行分割,要实现按列拆分的需求,用awk是最直接高效的方案,它能轻松处理从几百列到数万列的大文件场景。
针对100列拆分为5个20列文件的命令
假设原文件名为input.tsv,执行以下命令会生成output_1.tsv到output_5.tsv五个文件,每个文件包含100行、每行20列:
awk -F '\t' '{ for (i=1; i<=NF; i+=20) { out_file = "output_" int(i/20 + 1) ".tsv" curr_line = "" for (j=i; j<i+20 && j<=NF; j++) { curr_line = curr_line (j>i ? "\t" : "") $j } print curr_line > out_file } }' input.tsv
扩展到60000列拆分为60个1000列文件的命令
只需调整块大小参数,就能适配大规模列拆分场景:
awk -F '\t' '{ block_size = 1000 for (i=1; i<=NF; i+=block_size) { out_file = "output_" int(i/block_size + 1) ".tsv" curr_line = "" for (j=i; j<i+block_size && j<=NF; j++) { curr_line = curr_line (j>i ? "\t" : "") $j } print curr_line > out_file } }' input.tsv
关键说明
-F '\t':指定输入文件的分隔符为制表符NF:awk内置变量,表示当前行的总列数- 外层循环按指定的块大小遍历列,计算输出文件名
- 内层循环拼接当前块的所有列,确保行内仍以制表符分隔
- 即使最后一块的列数不足指定大小,脚本也会自动处理剩余列,不会丢失数据
内容的提问来源于stack exchange,提问作者Vijay Seethana
相关产品推荐
相关产品推荐

