使用Bash处理CSV时无法完整输出带双引号列,求解决方案
解决带引号CSV的列提取问题
你的问题出在普通文本工具无法识别CSV中引号包裹的字段——cut会把引号内的逗号当成列分隔符,导致字段切割错误;另外原命令里的tail跳过了表头、uniq会删除重复行、tr -d ' '会误删空格,这些都和你的预期不符。
正确解决方案
方案1:用awk处理(Git-Bash自带,无需额外安装)
awk支持通过FPAT定义CSV字段的匹配规则,能正确识别带引号的字段:
awk 'BEGIN {FPAT = "([^,]+)|(\"[^\"]+\")"; OFS=","} {print $1, $3, $4}' csv_file3.csv
FPAT = "([^,]+)|(\"[^\"]+\")":定义字段为「不含逗号的内容」或「双引号包裹的内容」,完美适配CSV格式OFS=",":指定输出分隔符为逗号- 直接打印第1、3、4列,保留表头,不会破坏引号内的内容
如果需要按原命令里的Data列排序(你的预期输出没排序,可按需选择):
awk 'BEGIN {FPAT = "([^,]+)|(\"[^\"]+\")"; OFS=","} {print $0}' csv_file3.csv | sort -t',' -k2,2
方案2:用csvkit(更直观的CSV专用工具)
先通过pip安装csvkit(Git-Bash里可直接执行):
pip install csvkit
然后用csvcut直接指定列名提取,完全不用考虑引号问题:
csvcut -c Account,Address,Name csv_file3.csv
原命令的问题拆解
cut -d, -f1,3,4:cut无法识别引号内的逗号,会把"303,SCA,JDM"拆成"303、SCA、JDM"三个字段,导致提取结果错误tail -n +2:跳过了表头,不符合你需要输出表头的预期uniq:会删除重复行,但你的预期输出保留了两行重复数据tr -d ' ':无差别删除所有空格,可能破坏需要保留的格式
内容的提问来源于stack exchange,提问作者Ram Kashyap
相关产品推荐
相关产品推荐

