如何编写Shell脚本计算文件中nmemb:()内数字的总和?
计算nmemb括号内数字总和的命令行方案
问题场景
我有一个名为X的文件,其中包含大量如nmemb:(123)、nmemb:(56789)格式的内容。已通过命令cat X | grep -o 'nmemb[^_]*$'提取出如下格式的行:
nmemb:(16384) nmemb:(16384) nmemb:(16384) nmemb:(5608) nmemb:(10776) nmemb:(16384) nmemb:(16384) nmemb:(16384) nmemb:(16384) nmemb:(16384)
需要编写后续处理逻辑,计算这些行中nmemb:()括号内数字的总和,实现类似cat X | grep -o 'nmemb[^_]*$' | doSumBetweenBracket()的效果。
方案1:用awk(最简洁高效)
直接用awk提取括号内数字并累加,一步完成:
cat X | grep -o 'nmemb[^_]*$' | awk -F'[()]' '{sum+=$2} END {print sum}'
嫌管道多的话,还能把grep和awk合并,减少进程:
awk '/nmemb:[0-9()]+$/ {split($0, a, /[()]/); sum+=a[2]} END {print sum}' X
原理:用[()]作为分隔符,每行拆分后第二个字段就是括号里的数字,累加后最后输出总和。
方案2:用sed+bc组合
先通过sed提取纯数字,再用bc做加法:
cat X | grep -o 'nmemb[^_]*$' | sed 's/.*(\([0-9]*\)).*/\1/' | paste -sd+ - | bc
原理:sed把每行替换成括号内的数字,paste -sd+ -把所有数字用加号连起来,最后交给bc计算总和。
方案3:用perl处理
用perl的正则匹配提取数字并累加:
cat X | grep -o 'nmemb[^_]*$' | perl -nle '$sum += $1 if /\((\d+)\)/; END {print $sum}'
原理:perl逐行读取内容,匹配括号内的数字并加到sum变量里,最后输出总和。
内容的提问来源于stack exchange,提问作者barfatchen
相关产品推荐
相关产品推荐

