不能不懂脚本

脚本实现sum/avg/max/min

我们假设data文件中每行是一个数字,我们来使用awk语言和perl语言对这些数字做求和、求平均、求最大、求最小等计算。

【awk版本】

1、求和

cat data|awk '{sum+=$1} END {print "Sum = ", sum}'

2、求平均

cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'

3、求最大值

cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'

4、求最小值(min的初始值设置一个超大数即可)

cat data | awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'

如果大家有更多更好的统计类命令,也请留言,我会随时补充道文章中。:)

【perl版本】

非常感谢meow同学提供的perl版本,加入到博文中:

1 求和

cat data|perl -lane '{$sum+=$F[0]}END{print "Sum:".$sum}'

2 求平均

cat data|perl -lane '{$sum+=$F[0]}END{print "Average=",$sum/$.}'

3 求最大值

perl -MList::Util=max -lane '{push @a,$F[0]}END{print max @a}' data

4 求最小值

perl -MList::Util=min -lane '{push @a,$F[0]}END{print min @a}' data

PS:希望各路脚本高手继续补充。:)

谢谢!

7条评论

  1. 平均:
    Ruby:
    cat data | ruby -e ‘nums=STDIN.readlines.map{|i|i.to_i}; puts “Average: #{1.0*nums.reduce(:+)/nums.size}”‘

    Bash:
    cat data | { while read i; do sum=$((sum+i)); ((count++)); done; echo -n “Average: “; echo “scale=4; $sum/$count” | bc; }

    Python:
    cat data | python -c ‘import sys; nums=[int(i) for i in sys.stdin.readlines()]; print “Average:”, 1.0*sum(nums)/len(nums)’

  2. cat data | python -c ‘import sys;print “Sum:”, sum(int(i) for i in sys.stdin.readlines())’
    cat data | python -c ‘import sys;print “Max:”, max(int(i) for i in sys.stdin.readlines())’
    cat data | python -c ‘import sys;print “Min:”, min(int(i) for i in sys.stdin.readlines())’

  3. cat data | { while read i; do sum=$((sum+i)); done; echo “Sum: $sum”; }
    cat data | sort -rn | { echo -n “Max: “; head -1; }
    cat data | sort -n | { echo -n “Min: “; head -1; }

  4. cat data | ruby -e ‘puts “Sum: #{STDIN.readlines.reduce(0){|s,i|s+i.to_i}}”‘
    cat data | ruby -e ‘puts “Max: #{STDIN.readlines.max{|a,b|a.to_i b.to_i}}”‘
    cat data | ruby -e ‘puts “Min: #{STDIN.readlines.min{|a,b|a.to_i b.to_i}}”‘

  5. perl -lane ‘{$sum+=$F[0]}END{print “Sum=”.$sum}’
    perl -lane ‘{$sum+=$F[0]}END{print “Average=”,$sum/$.}’
    perl -MList::Util=max -lane ‘{push @a,$F[0]}END{print max @a}’
    perl -MList::Util=min -lane ‘{push @a,$F[0]}END{print min @a}’

  6. 比较简单的格式化处理还行,文本处理一旦比较复杂了,用awk真是虐心,即便用gawk也不会轻松很多。其实一旦发现awk写的比较复杂了,干脆换perl,或者写python。虽说速度上比awk略慢一点,但省时省力。

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *