Linux下统计文件每行分隔符数量并补全的Shell脚本实现方案
Shell脚本分隔符补全实现
核心逻辑说明
- 提前定义实际使用的分隔符(支持逗号、制表符、竖线等任意单字符分隔符,修改变量值即可适配)
- 逐行读取文件时,通过bash内置参数展开统计当前行分隔符实际数量,无需调用外部命令,执行效率更高
- 对比要求的13个分隔符阈值做对应处理:
- 数量等于13:直接输出原行
- 数量不足13:在行尾补全对应数量的缺失分隔符后输出
- 数量超过13:将异常行打印到标准错误流,方便后续排查格式问题
- 读取行时使用
IFS= read -r的标准写法,避免行首尾空白、转义字符被意外截断
补全后的完整脚本
#!/usr/bin/bash # 替换为实际使用的分隔符,制表符填sep=$'\t',竖线填sep="|" sep="," # 要求的每行分隔符总数 target_sep_count=13 while IFS= read -r p; do # 统计当前行分隔符数量:删除所有非分隔符字符,剩余字符串长度即为分隔符个数 current_sep_str=${p//[^$sep]/} current_sep_count=${#current_sep_str} if [ $current_sep_count -lt $target_sep_count ]; then # 计算需要补充的分隔符数量 diff=$((target_sep_count - current_sep_count)) # 生成对应数量的分隔符字符串 add_sep=$(printf "%${diff}s" | tr ' ' "$sep") # 拼接补全后的行输出 echo "${p}${add_sep}" elif [ $current_sep_count -eq $target_sep_count ]; then # 数量符合要求直接输出 echo "$p" else # 分隔符超量的异常行输出到错误流,不混入正常结果 echo "格式异常:行分隔符数量为${current_sep_count},超过阈值${target_sep_count},行内容:${p}" >&2 fi done < myDataFile
使用注意事项
- 禁止直接修改原文件,执行脚本时将标准输出重定向到新文件即可,命令示例:
bash fix_sep.sh > fixed_myDataFile - 若源文件为Windows格式(带
\r换行符),需先执行dos2unix myDataFile转码后再运行脚本,否则分隔符统计结果会出错 - 分隔符超量的异常行默认输出到终端,如需留存异常记录,可将错误流重定向到日志文件:
bash fix_sep.sh > fixed_myDataFile 2> format_error.log
内容的提问来源于stack exchange,提问作者Mina El-Raheb
相关产品推荐
相关产品推荐

