MacOS Terminal按第一列值拆分CSV并生成对应TXT文件
解决MacOS终端拆分含特殊字符CSV的单条命令方案
由于你的CSV第二列包含空格、逗号、撇号及重音字符,普通按逗号分割的工具会解析出错,必须使用能正确识别CSV格式的方法,以下是两种可行的单条命令方案:
方案一:使用MacOS自带的BSD awk
MacOS的awk支持FPAT参数来精准匹配带引号的CSV字段,命令如下:
awk 'BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")" } { # 去除字段首尾的双引号(如果存在) key = gensub(/^"|"$/,"","g",$1) val = gensub(/^"|"$/,"","g",$2) # 替换文件名中的非法字符为下划线,避免创建文件失败 safe_key = gensub(/[\/:*?"<>|]/,"_","g",key) filename = safe_key ".txt" # 首次写入分类时,先将分类值作为首行写入 if (!(safe_key in seen)) { print key > filename seen[safe_key] = 1 } # 追加第二列内容到对应文件 print val >> filename close(filename) }' input.csv
关键说明:
FPAT定义了CSV字段的匹配规则:要么是不含逗号的字符串,要么是被双引号包裹的任意字符串(可包含逗号、空格等特殊字符)gensub用于清理字段的双引号,同时替换文件名中的非法字符(如斜杠、冒号)close(filename)避免打开过多文件句柄,防止触发系统限制
方案二:使用MacOS自带的Python
如果awk语法让你觉得复杂,用Python的csv模块更直观,同样是单条命令:
python3 -c "import csv, os; from collections import defaultdict; data = defaultdict(list); with open('input.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) # 若CSV无表头,删除下面这行 next(reader) for row in reader: if row: data[row[0]].append(row[1]) for key, vals in data.items(): # 替换文件名非法字符 safe_key = key.translate(str.maketrans({'/':'_', ':':'_', '*':'_', '?':'_', '"':'_', '<':'_', '>':'_', '|':'_'})) filename = f'{safe_key}.txt' with open(filename, 'w', encoding='utf-8') as f_out: f_out.write(f'{key}\n') f_out.write('\n'.join(vals) + '\n')"
关键说明:
- 用
csv.reader原生解析CSV,完美兼容所有特殊字符 - 代码包含跳过表头的逻辑,无表头时删除
next(reader)即可 str.maketrans统一替换文件名中的非法字符,确保文件能正常创建
内容的提问来源于stack exchange,提问作者big_smile
相关产品推荐
相关产品推荐

