2011-02-08 10 views
0

ユーザーエージェント(UA)のデバイスIDの結果を示すタブ区切り形式のデータがあります。デバイスが誤って識別されている行がいくつかあり、それらを正しい行に変更する必要があります。データファイル内の行を別の行の値で更新する

たとえば、iphoneやhtc野火UAが別の電話として識別される場合があります。そのため、UAの特定のキーワードを検索することによって、正しいデバイスでデバイス情報を更新する必要があります。例えば、

781 Mozilla/5.0 (Linux; U; Android 2.1-update1; fi-fi; HTC_Wildfire_A3333 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 htc_wildfire_ver1_suba3333 HTC  Wildfire Android 

これは正しいですが、似たようなケースは

775 Mozilla/5.0 (Linux; U; Android 2.1-update1; fi-fi; HTC Wildfire Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 (AdMob-ANDROID-20100709) T-Mobile  Pulse Android 

だから、私はこのような何かをしなければならない間違っています。 UAの列にHTCとWildfireという用語が含まれている場合、それはその電話機です。だから、文字列HTCとWildfireを持つが、列3と4(manufucturerとmodel)が間違っているすべてのUAを探して、私が知っている行781の正しいデバイス情報でそれらを更新したい。私は手動で行781が正しいコードを入れて、デバイスが正しく識別されない場合、これらのすべてのケースの行781の3列目以降の情報を入れます。

もちろんこれは1つのケースで、このようなケースがいくつかありますが、それぞれについて同じロジックを繰り返すことになります。また、私が示していないこれらの4つの列以外の列もあります。

どのように私はこれをperlスクリプト(できればbashの解決策もOKです)で実現します。

答えて

0
  1. ハッシュのキーとして三重を記憶し、入力ファイルをループのすべての異なる(UA、メーカー、モデル)トリプルのファイル(デバイス)を作成します。デバイスに手動でソートされたキーを書き込む
  2. デバイスを手動で編集する(「間違った行を削除する」)
  3. デバイスをハッシュに読み込み、UAをキーとして使用します(メーカー、モデル)。入力ファイルをループし、現在の行のUAフィールドを使用してデバイスをルックアップし、必要に応じてハッシュの適切な値を使用して両方のフィールドを変更します。

my @Log = (
     [ 'HTC', 'badModelHTC' ] 
     , [ 'ABC', 'badModelABC' ] 
     , [ 'HTC', 'goodModelHTC' ] 
     , [ 'ABC', 'badModelABC' ] 
     , [ 'ABC', 'goodModelABC' ] 
     , [ 'HTC', 'goodModelHTC' ] 
     , [ 'ABC', 'badModelABC' ] 
    ); 
    my %Devs; 
    printf "----------- Log org\n"; 
    for (@Log) { 
     printf "%s %s\n", @{$_}; 
     my $key = join '-', @{$_}; 
     $Devs{ $key } = $_->[ 1 ]; 
    } 
    printf "----------- Devs org\n"; 
    for (sort(keys(%Devs))) { 
     printf "%s => %s\n", $_, $Devs{ $_ }; 
     if (/bad/) { 
      delete $Devs{ $_ }; # fake manual removal 
     } 
    } 
    # fake manual shortening of keys 
    my %Tmp = %Devs; 
    %Devs =(); 
    for (keys %Tmp) { 
     $Devs{ (split(/-/, $_))[ 0 ] } = $Tmp{ $_ }; 
    } 
    printf "----------- Devs corrected\n"; 
    for (sort(keys(%Devs))) { 
     printf "%s => %s\n", $_, $Devs{ $_ }; 
    } 
    printf "----------- Log corrected\n"; 
    for (@Log) { 
     $_->[ 1 ] = $Devs{ $_->[ 0 ] }; 
     printf "%s %s\n", @{$_}; 
    } 

出力:

----------- Log org 
    HTC badModelHTC 
    ABC badModelABC 
    HTC goodModelHTC 
    ABC badModelABC 
    ABC goodModelABC 
    HTC goodModelHTC 
    ABC badModelABC 
    ----------- Devs org 
    ABC-badModelABC => badModelABC 
    ABC-goodModelABC => goodModelABC 
    HTC-badModelHTC => badModelHTC 
    HTC-goodModelHTC => goodModelHTC 
    ----------- Devs corrected 
    ABC => goodModelABC 
    HTC => goodModelHTC 
    ----------- Log corrected 
    HTC goodModelHTC 
    ABC goodModelABC 
    HTC goodModelHTC 
    ABC goodModelABC 
    ABC goodModelABC 
    HTC goodModelHTC 
    ABC goodModelABC 
関連する問題