如何移除CSV文件每行末尾指定带引号字段(含多行字段)
解决CSV文件末尾固定字段的移除问题
我来帮你搞定这个CSV处理的小麻烦!你的需求很明确:源系统生成的CSV每行末尾都带着固定的",qqqqzzzz"后缀,需要把这部分删掉,同时保证带逗号的引号字段不被破坏。
为什么你之前的方法会出问题?
- 把换行替换成空格再拆分的操作,会彻底打乱CSV的行结构,尤其是带引号的字段里本来就有逗号,拆分时很容易导致引号配对错位,出现你遇到的
""错误。 - 合并行的
sed 'N;N;...'操作完全没必要,反而会让行结构混乱,自然匹配不到正确的末尾字段。
正确的解决方案
针对你的场景(每行末尾固定是",qqqqzzzz"),最直接的方法是用sed精准匹配行尾的目标字符串并删除:
sed 's/,"qqqqzzzz"$//' all.csv > results.csv
命令解释:
s/,"qqqqzzzz"$//:表示查找行尾($是行尾锚点)的",qqqqzzzz"字符串,然后替换为空(也就是删除)。- 这个命令不会影响中间带逗号的引号字段,因为我们只匹配行尾的固定内容,完美规避了CSV字段内逗号的干扰。
用你的测试输入运行这个命令,输出正好是你期望的结果:
1,"Bob Smith 531 Pennsylvania Avenue Washington, DC",3,4
5,"Bob Smith 531 Pennsylvania Avenue Washington, DC",6,7
备选方案:用awk处理字段数
如果你的CSV每行的最后一个字段确实都是这个固定值,也可以用awk直接减少一个字段:
awk -F, 'BEGIN{OFS=","} {NF--; print}' all.csv > results.csv
-F,:设置字段分隔符为逗号OFS=",":设置输出字段分隔符为逗号,保证输出格式还是CSVNF--:把字段数减1,也就是去掉最后一个字段print:打印处理后的行
这个方法更通用,如果以后末尾的固定值有变化,只要是最后一个字段都可以用,但sed的方法更精准匹配你的特定场景。
内容的提问来源于stack exchange,提问作者Vinod
相关产品推荐
相关产品推荐

