Обновление строки в файле данных значениями из другой строки - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть некоторые данные в форме с разделителями табуляции, которые дают результат идентификации устройства от пользовательских агентов (UA).но есть несколько строк, в которых устройства ошибочно идентифицированы, и мне нужно изменить их на правильные.

Например, есть случаи, когда iphone или htc wildfire 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, то это тот телефон.Итак, я хочу найти все UA, которые имеют строки HTC и Wildfire, но столбцы 3 и 4 (производитель и модель) неверны, а затем обновить их, указав правильную информацию об устройстве из строки 781, которая, как я знаю, верна.Я вручную вставил бы код, чтобы строка 781 была правильной, и если устройство не было правильно идентифицировано, я бы поместил информацию из столбца 3 и далее в строку 781 для всех этих случаев.Есть несколько таких случаев, и я бы повторил ту же логику для каждого из них.Также есть и другие столбцы, кроме этих четырех, которые я не показывал.

как бы я это сделал в Perl-скрипте (желательно, но решение bash тоже подойдет).

1 Ответ

0 голосов
/ 08 февраля 2011
  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", @{$_};
    }

output:

    ----------- 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
...