2011-01-24 21 views
2

すべての.mobiファイルの合計サイズを link(これは良いリンクです)から計算したいと思います。サイズ表記の合計を計算しますか?

私の学習経験としてこれを作るの私の試みで、私は「パイプ」(のはそれを呼びましょう)その出力のようになります。そのページから、すべてのサイズ作った:

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)を取得することです。これらの数値を合計します。 私の質問は、パイプライン( | some_other_commands)を使って、その目標をどのように計算するかです。 Pythonやその他の言語(好ましくは1つのライナー)を使用した回答は大歓迎です。どうもありがとう。

+0

私はpython男です。どのようなpythonish答えで誰ですか? – wakandan

答えて

5

を持っている場合:

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

これは素晴らしいことです。 1つの新しいコマンドを学習する。どうもありがとう。 – wakandan

+0

+1、本当にいいです。 – codaddict

3

ため息、誰かが“ワンライナー”とすべての私のコードゴルフ反射神経の火が

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 @[email protected]_f+$_.to_f*{"M"=>1,"K"=>0.001}[$_[-2,1]]' 

更新: Heh、ok、読みにくい。 OPは「1ライナー」を求めた。 :-)

#!/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] 
+0

私はこれが私のような初心者のためではないと言います。ありがとう。 :D – wakandan

+0

Perlは読みにくいと言う人は – gabuzo

3

Perlのワンライナー:

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

see it

はオプス入力に示すように、すべてのエントリがキロバイトまたはメガバイトのいずれかであることを前提としています。

2

あなたは楽しみのために、シェル内の溶液ルビー(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)) 
+0

こんにちは。これはまさに私が "1つのライナー"を意味するものではない))。あなたのルビーはよく見える。ありがとう。 – wakandan

1

のawkを(1K未満のファイルは、実質的にトータルに追加しないと仮定) :

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