如何通过命令行基于ID列正确拆分CSV文件?
解决按ID列拆分CSV文件的问题
我来帮你搞定这个CSV拆分的问题!你原来的awk命令没达到预期,主要是因为没处理表头、文件名不符合要求,还有没处理同一ID多条记录的追加逻辑。下面给你详细的解决方案:
问题分析
你原来的命令 awk -F, '{print >> $1}' input.csv 存在几个问题:
- 表头行(第一行)会被写入名为
ID的文件,而不是每个目标文件都包含表头; - 生成的文件名是直接用ID值(比如
1、2),不是你想要的file_<ID>_May_report格式; - 如果输入文件的行格式不规范(比如所有内容挤在一行),也会导致输出异常,但从你期望的结果来看,应该是每行一条记录的标准CSV。
正确的awk解决方案
使用下面的awk命令,既能按ID拆分文件,又能给每个文件加上表头,还能生成你需要的文件名:
BEGIN {FS=","} NR==1 { header = $0 next } { filename = "file_" $1 "_May_report" # 第一次处理该ID时,先写入表头 if (!seen[$1]++) { print header > filename } # 追加当前行到目标文件 print >> filename # 关闭文件,避免打开过多句柄(ID多的时候很重要) close(filename) }
命令解释
BEGIN {FS=","}:提前设置字段分隔符为逗号,确保正确识别CSV的列;NR==1 {header=$0; next}:捕获第一行的表头内容,保存到header变量,然后跳过表头行,直接处理数据行;filename="file_" $1 "_May_report":根据当前行的ID($1)生成你需要的文件名;if (!seen[$1]++):用seen数组记录每个ID是否已经处理过,第一次处理时(seen[$1]初始为0,取反为真),先把表头写入目标文件;print >> filename:将当前数据行追加到对应ID的文件中;close(filename):每次写完后关闭文件,避免awk同时打开过多文件导致报错。
测试效果
用你提供的输入数据(确保每行一条记录):
ID,DATE,EARNING 1,12 May 2018,5 1,13 May 2018,15 2,12 May 2018,25
运行命令后,file_1_May_report的内容会是:
ID,DATE,EARNING 1,12 May 2018,5 1,13 May 2018,15
file_2_May_report的内容会是:
ID,DATE,EARNING 2,12 May 2018,25
完全符合你的需求!
内容的提问来源于stack exchange,提问作者user2759617
相关产品推荐
相关产品推荐

