2011-12-16 14 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

Grepは置き換えを行いません。そのためにはsedが必要です。しかし、sedは数学や条件文を使うことができないので、x1024の完全なK/Mが必要ならawkが必要です。

sed -e s/K/000/ -e s/M/000000/ 
フル1024

Awkのコードを、あなたはgawkのかswitchと別のインタプリタを持っている場合:

あなたはX1000と一緒に暮らすことができる場合は、簡単にゼロの適切な数のK/Mを交換するsedを使用することができます
#!/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 
} 

このフィールドの前に多くの引用符、$NFへの変更$2の可能性があります場合。 あなたの通訳者にswitchがない場合は、ifの文を乗算したものを使うか、Kentの答えを使うことができます。私は、"をセパレータとして使用し、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の道:

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 

出力:

あなたの例で

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 

テスト

あなたは引用符を使用しない場合:

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 
関連する問題