在处理数据格式转换时,我们常会遇到字段分隔符不一致的问题。 本文通过一个实际案例,解析如何高效地将 |
和空格分隔的文本转换为紧凑的逗号分隔格式,并提供 5种实现方案,助你快速解决同类问题。
原始数据示例 (raw_data
):
apple | 2023 Q3 | 1.5
banana | 2024 Q1 | 2.0
直接使用以下命令时:
awk -F'|' '{print $1","$2","$3}' raw_data
输出结果出现多余空格:
apple , 2023 Q3 , 1.5
banana , 2024 Q1 , 2.0
awk -F' *\\| *' -v OFS=',' '{print $1,$2,$3}' raw_data
•原理:通过正则表达式 *\\| *
匹配竖线前后的空格•优势:保留字段内部自然空格(如"2023 Q3")
awk -F'|' '{
gsub(/^[ \t]+|[ \t]+$/, "", $1);
gsub(/^[ \t]+|[ \t]+$/, "", $2);
gsub(/^[ \t]+|[ \t]+$/, "", $3);
print $1","$2","$3
}' raw_data
•原理:逐个字段去除首尾空白•适用场景:需要精确控制每个字段的处理
sed -E 's/[[:space:]]*\|[[:space:]]*/,/g' raw_data
•原理:直接替换竖线及周边空格为逗号•优势:单行命令快速处理
tr -d ' ' < raw_data | awk -F'|' '{print $1","$2","$3}'
•原理:先删除所有空格再处理•注意:会丢失字段内合法空格(如"2023 Q3"被处理为"2023Q3")
perl -ple 's/\s*\|\s*/,/g' raw_data
•原理:使用 Perl 正则表达式一步到位•亮点:支持更复杂的正则匹配
处理后的理想输出:
apple,2023 Q3,1.5
banana,2024 Q1,2.0
实测验证截图如下:
方法 | 执行速度 | 保留字段内空格 | 命令复杂度 | 可扩展性 |
---|---|---|---|---|
1 | ★★★★ | ✔️ | ★★ | 高 |
2 | ★★★ | ✔️ | ★★★★ | 中 |
3 | ★★★★★ | ✔️ | ★ | 低 |
4 | ★★★★★ | ❌ | ★ | 低 |
5 | ★★★★★ | ✔️ | ★★ | 高 |
1.awk 分隔符进阶:
•FS
支持正则表达式•OFS
控制输出分隔符
2.sed 正则技巧:
•[[:space:]]
匹配所有空白字符•\s
在扩展正则中匹配空白
3.数据清洗原则:
•优先保留有效信息•慎用全局替换•处理前后做数据校验
掌握这些方法后,面对各种格式数据转换需求时就能游刃有余。建议根据实际数据特征选择最合适的处理方案,复杂场景可组合使用多种工具。