найти подстроку, заменить и умножить на 1024 - PullRequest
3 голосов
/ 16 декабря 2011

У меня есть файл с таким содержимым:

03:14.27,"31K" 
03:13.59,"50M" 
04:11.51,"435K" 

Вопрос в том, как получить числа в байтах и ​​заменить их старыми значениями, чтобы я мог их получить (также было бы полезно избавиться от кавычек).):

03:14.27,"31744"
...... 

Что использовать лучше?grep или awk?Спасибо!

Ответы [ 3 ]

4 голосов
/ 16 декабря 2011

Perl!

fg@erwin $ cat t.pl
#!/usr/bin/perl -W

use strict;

my %suffixes = (
        "K" => 10,
        "M" => 20,
        "G" => 30
);

while (my $line = <STDIN>) {
    $line =~ s/"(\d+)(\w)"/ '"' . ($1 << $suffixes{$2}) . '"'/ge;
    print $line;
}
fge@erwin ~ $ cat <<EOF | perl t.pl
> 03:14.27,"31K" 
> 03:13.59,"50M" 
> 04:11.51,"435K"
> EOF
03:14.27,"31744" 
03:13.59,"52428800" 
04:11.51,"445440"

(редактировать: новый ввод)

2 голосов
/ 16 декабря 2011

awk way:

 awk 'BEGIN{k=1024;m=1024*k;g=1024*m;FS=OFS="\""}
        {x=substr($2,1,length($2)-1)*1}
        $2~/[Kk]$/{x*=k}
        $2~/[mM]$/{x*=m}
        $2~/[Gg]$/{x*=g}
        {print $1,x"\""} yourFile

тест на вашем примере:

kent$  cat tt
03:14.27,"31K" 
03:13.59,"50M" 
04:11.51,"435K"

kent$  awk 'BEGIN{k=1024;m=1024*k;g=1024*m;FS=OFS="\""}
        {x=substr($2,1,length($2)-1)*1}
        $2~/[Kk]$/{x*=k}
        $2~/[mM]$/{x*=m}
        $2~/[Gg]$/{x*=g}
        {print $1,x"\""}' tt

выход:

03:14.27,"31744"
03:13.59,"52428800"
04:11.51,"445440"

если вы не хотите кавычки:

 awk 'BEGIN{k=1024;m=1024*k;g=1024*m;FS="\""}
        {x=substr($2,1,length($2)-1)*1}
        $2~/[Kk]$/{x*=k}
        $2~/[mM]$/{x*=m}
        $2~/[Gg]$/{x*=g}
        {print $1,x} yourFile
1 голос
/ 16 декабря 2011

Grep не делает замен, для этого вам понадобится sed.Но sed не может выполнять математические или условные вычисления, поэтому, если вам нужен полный x1024 K / M, вам понадобится awk.Если вы можете жить с x1000, вы можете легко использовать sed, чтобы заменить K / M соответствующим количеством нулей:

sed -e s/K/000/ -e s/M/000000/

Код Awk для полных 1024, если у вас есть gawk или другой интерпретатор с switch:

#!/usr/bin/awk -f
BEGIN { FS = "\""; OFS = "\"" }
{
        N = $2+0
        if(N == 0) { print; next }       
        M = substr($2,length($2),1)
        switch(M) {
                # Add T, P, X, etc. if you need them.  Or just for fun.
                case "G": N *= 1024
                case "M": N *= 1024
                case "K": N *= 1024
        }
        $2 = N
        print
}

Если перед этим полем есть возможность добавить кавычки, измените $2 на $NF.Если у вашего переводчика нет switch, вы можете использовать if заявления с умноженными продуктами или использовать ответ Кента.Я просто хотел показать использование " в качестве разделителя и правильное использование падений switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...