Общее значение в файле с использованием сценария оболочки, где значения в ГБ, МБ, КБ, В - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть файл, в котором значения в столбце с единицами mb, kb, b и gb, я хочу, чтобы сумма этих значений с использованием сценария оболочки, и результат будет в Total gb

cat test_file

24k
556m
1.2g
6.2m
17m
24k
254b
30g
1.6g
28k
120b

Я могу конвертировать байтовые данные в мегабайты, но застрял, чтобы конвертировать килобайты и общую сумму всех

test=0 
for i in `cat test_file` 
do 
b=echo $i|tr -d '[:alpha:]' 
a=echo $i|tr -d '/0-9,\./' 
if [ "$a" == "b" ]; then 
b=($b/1024) fi test=echo $test + $b | bc 
done 
result=$(echo "scale=2; $test / 1024" | bc) 
echo $result 

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Вот Perl версия:

perl -nle 'BEGIN {for (qw(k m g t)) {$m{$_}=1000**++$i}}; ($v,$u)=/([\d\.]+)([kmgt])?/; $v*=$m{$u} if $u; $t+=$v; END {print "Total $t Bytes\n"}' test_file 

Или на нескольких строках для удобства чтения:

perl -nle '
  BEGIN { for (qw(k m g t)) {$m{$_}=1000**++$i} }; # create multipliers hash
  ($v,$u) = /([\d\.]+)([kmgt])?/;                  # get value and optional unit
  $v *= $m{$u} if $u;                              # multiply to get bytes (if unit was specified)
  $t += $v;
  END { print "Total $t Bytes\n"}' test_file 

Это дает мегабайты как 1'000'000 байтов. Если ваши значения представляют двоичные числа Mebibytes et c., Замените 1000 на 1024.

Более читаемая версия инициализации множителя ha sh будет:

BEGIN { @m{ qw(k m g t) } = (1000, 1000**2, 1000**3, 1000**4) };

Если Ваши единицы также могут быть написаны в смешанном регистре, добавьте $_=lc; перед регулярным выражением, чтобы сначала сделать все это строчными.

0 голосов
/ 21 февраля 2020

1-е решение: Использование switch case в GNU awk:

awk '
{
last_char=tolower(substr($0,length($0)))
switch(last_char){
  case "k":
    sum+=($0+0)/(1024*1024)
    break
  case "m":
    sum+=($0+0)/(1024)
    break
  case "g":
    sum+=$0+0
    break
  case "b":
    sum+=($0+0)/(1024*1024*1024)
    break
  case "?":
    print "Line is not matching anything here...."
}
}
END{
  print sum
}'  Input_file


2-е решение: Не могли бы вы попробовать следующее, это решение использует условия if, else.

awk '
{
  if($0~/[kK]$/){
    sum+=($0+0)/(1024*1024)
  }
  if($0~/[mM]$/){
    sum+=($0+0)/(1024)
  }
  if($0~/[gG]$/){
    sum+=$0+0
  }
  if($0~/bB]$/){
    sum+=($0+0)/(1024*1024*1024)
  }
}
END{
  print sum
}
'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...