需求:用BASH脚本按列值拆分管道分隔文件并保留表头
按列拆分管道分隔文件并保留指定列的BASH脚本实现
需求概述
处理管道分隔的fulldata.tmp文件(支持改为逗号分隔,偏好管道),实现:
- 按第1列的值拆分各行到独立文件
- 每个输出文件仅保留指定列(示例取前4列)
- 输出文件命名为
final_${第1列值}.csv - 数据可预先排序,调试环境无终端交互权限
示例输入
GROUPID|LABEL|DATE|ACTIVE|COMMENT ABC|001|2022-09-15|True|None DEF|001|2022-09-16|False|None GHI|002|2022-10-17|True|Future
期望输出
final_ABC.csv
GROUPID|LABEL|DATE|ACTIVE ABC|001|2022-09-15|True
final_DEF.csv
GROUPID|LABEL|DATE|ACTIVE DEF|001|2022-09-16|False
final_GHI.csv
GROUPID|LABEL|DATE|ACTIVE GHI|002|2022-10-17|True
核心实现脚本
使用awk即可完成所有需求,脚本如下:
awk -F'|' ' BEGIN {OFS="|"} NR==1 { header = $1 OFS $2 OFS $3 OFS $4 next } { filename = "final_" $1 ".csv" if (!seen[filename]++) { print header > filename } print $1, $2, $3, $4 >> filename close(filename) } ' fulldata.tmp
脚本说明
-F'|':指定输入数据的分隔符为管道BEGIN {OFS="|"}:设置输出数据的分隔符为管道,保证格式统一NR==1分支:处理表头行,提取需要保留的前4列存为header变量,然后跳过当前行的后续处理- 正文行处理:
- 拼接生成目标文件名
final_$1.csv seen[filename]++:通过数组标记文件是否已创建,首次创建时写入表头- 打印当前行的指定列到目标文件
close(filename):及时关闭文件,避免因打开过多文件句柄导致报错
- 拼接生成目标文件名
灵活调整说明
- 修改输出列:调整
header变量和print语句中的列索引即可,例如要输出第1、3、5列,改为:header = $1 OFS $3 OFS $5 # ... print $1, $3, $5 >> filename - 切换为逗号分隔:将
-F'|'改为-F',',OFS="|"改为OFS=","即可适配逗号分隔的输入文件
内容的提问来源于stack exchange,提问作者sandsawks
相关产品推荐
相关产品推荐

