找到子字符串,替换并乘以1024

时间:2011-12-16 14:17:17

标签: grep

我的文件内容如下:

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

问题是如何以字节为单位获取数字并用旧值替换以便我可以得到(也取消引号会很有用):

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

更好用的是什么? grep还是awk? 谢谢!

3 个答案:

答案 0 :(得分:4)

的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"

(编辑:新输入)

答案 1 :(得分:2)

awk方式:

 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

答案 2 :(得分:1)

Grep不做替换,你需要sed。但是sed不能做数学或条件,所以如果你想要完整的x1024 K / M,你需要awk。如果你可以使用x1000,你可以轻松使用sed用适当的零数替换K / M:

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

完整1024的awk代码,如果你有switch的gawk或其他翻译:

#!/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语句或使用Kent的答案。我只想展示使用"作为分隔符并正确使用switch个漏洞。