如何筛选CSV文件中双引号外分号数量不等于6的行?
解决CSV双引号外分号数量筛选问题
你的核心问题是常规分号分割会误将双引号内的分号识别为字段分隔符,导致统计错误。要实现筛选双引号外分号数量不等于6的行,可以用awk编写字符遍历逻辑,精准区分引号内外的分号:
TARGETFILE=data.csv variable=$(awk ' { semicolon_count = 0 in_quotes = 0 # 逐字符遍历当前行 for (char_pos = 1; char_pos <= length($0); char_pos++) { current_char = substr($0, char_pos, 1) # 遇到双引号时切换引号状态(进入/退出引号区域) if (current_char == "\"") { in_quotes = !in_quotes } # 仅统计不在引号内的分号 else if (current_char == ";" && !in_quotes) { semicolon_count++ } } # 筛选引号外分号数量不等于6的行 if (semicolon_count != 6) { print $0 } }' "$TARGETFILE")
代码逻辑说明
- 用
semicolon_count统计引号外的分号数量,in_quotes标记当前是否处于双引号内部 - 逐字符扫描每行内容:
- 碰到双引号就切换
in_quotes的状态,以此区分是否在引号区域内 - 只有遇到分号且当前不在引号内时,才增加计数
- 碰到双引号就切换
- 最后判断计数是否不等于6,满足条件则输出该行
针对你给出的示例数据:
- 第三行
;;;"Third;Fourth";;;;:引号外的分号共7个,会被筛选输出 - 第四行
;;"Fifth;Sixth";;;;:代码会严格统计引号外的分号数量,只要不等于6就会纳入结果
内容的提问来源于stack exchange,提问作者Almosino
相关产品推荐
相关产品推荐

