Unix环境下如何将以","为分隔符的50M条记录文件转为竖线分隔?
大文件替换带引号的逗号分隔符为竖线的可行方案
你的核心问题是要替换的分隔符并非单纯的逗号,而是","(双引号+逗号+双引号),之前工具未生效大概率是匹配模式错误。以下是针对超大规模文件(50M条记录)的高效处理方法:
基础替换(仅替换中间分隔符)
如果仅需将","替换为|,保留首尾的双引号,可使用以下命令:
sed
sed -e 's/","/|/g' input.txt > output.txt
- 说明:
s/","/|/g全局匹配","并替换为竖线;input.txt是源文件,output.txt是输出文件,大文件建议先输出到新文件验证后再覆盖原文件。
awk
awk '{gsub(/","/,"|")}1' input.txt > output.txt
- 说明:
gsub实现全局替换,1表示打印处理后的每一行,awk对大文件的处理效率稳定。
perl
perl -pe 's/","/|/g' input.txt > output.txt
- 说明:
-p循环处理每行并打印,-e执行替换脚本,perl在复杂文本处理场景下性能优异。
完整格式修正(同时去除首尾双引号)
根据你的期望输出,首尾的双引号也需要去除,可调整命令如下:
sed
sed -e 's/^"//' -e 's/"$//' -e 's/","/|/g' input.txt > output.txt
- 说明:
s/^"//移除行首双引号,s/"$//移除行尾双引号,最后替换中间分隔符。
awk
awk '{gsub(/^"|"$/,""); gsub(/","/,"|")}1' input.txt > output.txt
- 说明:先通过
gsub(/^"|"$/,"")清除首尾引号,再替换中间分隔符。
perl
perl -pe 's/^"//; s/"$//; s/","/|/g' input.txt > output.txt
- 说明:依次执行移除行首引号、行尾引号、替换分隔符三个操作。
大文件处理注意事项
- 先测试再执行:先用
head -100 input.txt截取小样本,验证命令输出符合预期后再处理全量文件 - 避免直接修改原文件:除非确认命令无误,否则不要使用
sed -i这类直接修改原文件的参数,防止数据丢失 - 优先选择原生工具:sed、awk、perl都是Unix系统原生工具,比高阶脚本语言的处理效率更高,适合超大规模文件
内容的提问来源于stack exchange,提问作者engrisaiah
相关产品推荐
相关产品推荐

