我想从中计算所有.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或任何其他语言(最好是一个内容)的答案。非常感谢。
答案 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"}'
它假设所有条目都是千字节或兆字节,如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)}'