我的文件内容如下:
03:14.27,"31K"
03:13.59,"50M"
04:11.51,"435K"
问题是如何以字节为单位获取数字并用旧值替换以便我可以得到(也取消引号会很有用):
03:14.27,"31744"
......
更好用的是什么? grep还是awk? 谢谢!
答案 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
个漏洞。