awk处理多分隔符文本时如何简化逻辑 提取count值存入数组
问题说明
待处理的文本格式如下:
Application.||dates:[2022-11-12]|models:[MODEL1]|count:1|ids:2320 Application.||dates:[2022-11-12]|models:[MODEL1]|count:5|ids:2320
需求为提取每行中count:后的数值,将所有提取结果存入shell数组。
原有实现通过两次awk管道处理完成提取,存在逻辑冗余、执行效率偏低的问题,原有代码如下:
nums=($(echo -n "$grepResult" | awk -F ':' '{ print $4 }' | awk -F '|' '{ print $1 }'))
优化方案
以下实现均避免了重复调用awk的冗余问题,可按需选择:
- 多分隔符单次awk实现
直接将|和:同时设置为字段分隔符,定位count字段后提取下一位的数值,不依赖count字段的固定位置,鲁棒性更好:nums=($(awk -F'[|:]' '{for(i=1;i<=NF;i++) if($i=="count") print $(i+1)}' <<< "$grepResult")) - 正则匹配单次awk实现
通过正则直接捕获count:后的数字串,不需要处理字段分割逻辑,写法最简洁:nums=($(awk 'match($0, /count:([0-9]+)/, res) {print res[1]}' <<< "$grepResult")) - 纯Bash原生实现
利用Bash内置的正则匹配能力完成提取,全程不调用外部命令,大文本场景下性能最优:nums=() while IFS= read -r line; do [[ $line =~ count:([0-9]+) ]] && nums+=("${BASH_REMATCH[1]}") done <<< "$grepResult"
内容的提问来源于stack exchange,提问作者r4bb1t
相关产品推荐
相关产品推荐

