Linux下正确切割含引号及内部逗号的CSV文件方法求助
正确提取含内部逗号的带引号CSV列
问题场景
现有如下CSV数据(部分字段包含带内部逗号的双引号):
"Name","Age","City" "John, Doe",30,"New York" "Alice","25","Los Angeles" "Bob","28","Chicago"
直接用awk -F'","'提取列会得到错误结果:
- 提取第1列时命令
awk -F'","' '{print $1}' data.csv输出:
"Name "John, Doe",30,"New York" "Alice "Bob
- 提取第3列时命令
awk -F'","' '{print $3}' data.csv输出:
City" Los Angeles" Chicago"
期望得到格式正确的列内容,比如第1列输出:
"Name" "John, Doe" "Alice" "Bob"
第3列输出:
"City" "New York" "Los Angeles" "Chicago"
解决方案
1. 使用专业CSV工具csvkit
csvkit是专门处理CSV的工具,能自动识别带引号的字段,避免内部逗号干扰:
- 安装(Debian/Ubuntu):
sudo apt install csvkit - 提取第1列:
csvcut -c 1 data.csv - 提取第3列:
csvcut -c 3 data.csv
执行后直接输出符合预期的格式化内容。
2. 改进awk命令处理首尾引号
通过对分割后的字段做首尾引号修正,实现正确提取:
- 提取第1列:
逻辑:先用awk -F'","' '{gsub(/^"/, "", $1); print "\"" $1 "\""}' data.csv","分割字段,移除第1个字段开头的引号,再给字段重新包裹双引号。 - 提取第3列:
逻辑:移除第3个字段结尾的引号,再重新包裹双引号。awk -F'","' '{gsub(/"$/, "", $3); print "\"" $3 "\""}' data.csv
3. 使用Python内置csv模块
利用Python自带的csv模块解析CSV,天然支持带引号的字段:
创建脚本extract_col.py(以提取第1列为例):
import csv with open('data.csv', 'r') as f: reader = csv.reader(f) for row in reader: print(f'"{row[0]}"')
若要提取第3列,将row[0]改为row[2](Python索引从0开始),执行脚本:
python3 extract_col.py
内容的提问来源于stack exchange,提问作者Mesc
相关产品推荐
相关产品推荐

