2012-11-05 77 views
1

我有下面有兩個條目多個文件:文件的代碼中添加多個文件號碼

$ cat file_01 
Total capacity     3.4 TB 
Capacity used     825.8 GB 

輸出是兩行。第一行具有總容量,第二行是使用的容量。

這是一臺服務器的輸出,我希望它可以合併我的其餘服務器。

我想創建一個簡單的腳本,它將添加所有Total容量和所有使用的容量從多個文件並提供一個合併輸出。殼牌或perl是我正在尋找的。

任何方向,這將是非常有益的。

感謝

+1

是大小總是以兆兆字節(或Tebibytes,TiB)表示,還是可以在GiB,MiB,KiB中?事實上,是基於小數還是基於二進制的大小? –

+0

某些值以TB結尾,一些以GB結尾。我想要轉換成TB全部 – maneeshshetty

回答

1

假設1TB = 1000GB:

cat file* | perl -ne ' 
    /.* (\d+.\d+) ([TG])B .* (\d+.\d+) ([TG])B/; 
    $x+=$1*($2==T?1000:1); 
    $y+=$3*($4==T?1000:1); 
    END{print "$x GB, $y GB\n"}' 
+3

UUOC獎項候選人? –

+0

@JonathanLeffler以防萬一這是管道的一部分,並且正在動態創建。 – Bitwise

+0

我試過你的代碼,我得到的輸出爲 0 GB,0GB – maneeshshetty

1

假設所有文件結核病報告(未經測試)

perl -lane ' 
    $total += $F[2]; $used += $F[6]; 
    END {print "total: $total; used: $used"} 
' file* 

如果您有不同的單位,可以考慮使用像Math::Units東西轉換例如,TB和GB之間。

0

下面應該做的伎倆:

awk '{ if ($4 == "GB") $3/=1000; s[FNR] += $3 } END { print "total: "s[1]" TB\nused: "s[2]" TB" }' file_* 

FNR - 行號文件

0

讀取並加載一個哈希表爲每種類型的GB,TB等。

cat file? | perl -ne ' 
chomp; 
@x = split(/\s+/,$_); 
$total{$x[-1]} += $x[-2]; 
while(<>){ 
    chomp; 
    @x = split(/\s+/,$_); 
    $total{$x[-1]} += $x[-2]; 
}; 
for $m1 (keys %total) { 
    print "$m1 , $total{$m1}\n"; 
}; 
'