2011-12-16 2 views
3

У меня есть файл с содержанием вроде:найти подстроку, заменить и умножить на 1024

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

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

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

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

+0

'Редактирование шоу '\ n' после каждого цитируемого значения. Так ли это файл, или это редакционное предположение? –

+0

@JonathanM код имеет '\ n', я просто сделал его видимым на моем редактировании. посмотрите исходный источник http://stackoverflow.com/revisions/62bc4eba-9597-4981-a71e-af32e239a732/view-source –

+0

@BookOfZeus, спасибо. –

ответ

1

Греп не выполняет замены, для этого вам понадобится sed. Но sed не может выполнять математику или условные обозначения, поэтому, если вам нужен полный x1024 K/M, вам понадобится awk. Если вы можете жить с X1000, вы можете легко использовать СЭД, чтобы заменить 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.

+1

На самом деле он делает, согласно заголовку вопроса – fge

+0

@fge Я хочу предоставить быстрый ответ с мобильного устройства, прежде чем я приступим к работе и смогу его протестировать. Полный ответ теперь поднят. – Kevin

4

perl!

[email protected] $ 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; 
} 
[email protected] ~ $ 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

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 
Смежные вопросы