计算大小标注数字的总和?

时间:2011-01-24 07:22:49

标签: bash shell

我想从中计算所有.mobi文件的总大小 link(顺便说一句,这是一个很好的联系)。

在尝试将此作为我的学习经历时,我制作了一个“管道”(让我们称之为 a ),从该页面输出所有大小,如下所示:

189K
20M
549K
2.2M
1.9M
3.1M
2.5M
513K
260K
1.1M
2.8M
5.1M
3.7M
1.5M
5.6M
1.0M
5.6M
1.5M
4.9M
3.4M
810K

我的目标是获得总大小(例如:50.50M,或50000K) - 所有这些数字的总和。 我的问题是,如何使用管道计算该目标( a | some_other_commands)。欢迎使用python或任何其他语言(最好是一个内容)的答案。非常感谢。

5 个答案:

答案 0 :(得分:5)

有趣的是shell中的解决方案:

a | sed -e 's/M$/ 1024 * +/'  -e 's/K$/ +/'  | dc -e '0' -f - -e 'p'

答案 1 :(得分:3)

叹息,有人说“one-liner”和我所有的 code-golf 反应火......

ruby -e 'puts $<.read.split.inject(0){ |m,e| m += e.to_f * { "M" => 1, "K" => 0.001 }[e[-1,1]]}.to_s+"M"'

或者,有一些快捷方式......

ruby -ne 'p @e=@e.to_f+$_.to_f*{"M"=>1,"K"=>0.001}[$_[-2,1]]'

更新:嘿,好的,难以阅读。 OP要求“一个班轮”。 : - )

#!/usr/bin/env ruby
total = 0
while s = gets                                       # get line
  scalefactorMK = s.chomp[-1,1]                      # get the M or K
  scalefactor = { 'M'=>1,'K'=>0.001 }[scalefactorMK] # get numeric scale
  total += s.to_f * scalefactor                      # accumulate total
end
puts "%5.1fM" % [total]

答案 2 :(得分:3)

Perl one-liner:

a | perl -ne 's/^([\d.]+)M$/$1*1024/e;$sum+=$_; END{print $sum."K"}'

see it

它假设所有条目都是千字节或兆字节,如OP输入中所示。

答案 3 :(得分:2)

如果你有Ruby(1.9 +)

require 'net/http'
url="http://hewgill.com/~greg/stackoverflow/ebooks/"
response = Net::HTTP.get_response( URI.parse(url) )
data=response.body
total=0
data.split("\n").each do |x|
    if x=~/\.mobi/
        size = x.split(/\s+/)[-1]
        c = case size[-1]
            when 'K' then 1024
            when 'M' then 1024 * 1024
            when 'G' then 1024 * 1024 * 1024
        end
        total+=size[0..-1].to_i * c
    end
end
puts "Total size: %.2f MB" %  ( total/(1024.0 * 1024.0) )

答案 4 :(得分:1)

awk(假设小于1K的文件基本上不会增加​​总数):

a | awk '/K/ {sum += $1/1024} /M/ {sum += $1} END {printf("%.2fM\n", sum)}'