Преобразование второго шаблона в миллисекунды в awk - PullRequest
0 голосов
/ 16 мая 2019

У меня есть файл с шаблоном 's', мне нужно преобразовать его в 'ms', умножив на 1000. Я не могу это сделать. Пожалуйста, помогите мне.

file.txt

First launch 1
App: +1s170ms

First launch 2
App: +186ms

First launch 3
App: +1s171ms

First launch 4
App: +1s484ms

First launch 5
App: +1s227ms

First launch 6
App: +204ms

First launch 7
App: +1s180ms

First launch 8
App: +1s177ms

First launch 9
App: +1s183ms

First launch 10
App: +1s155ms

Мой код:

awk 'BEGIN { FS="[: ]+"}
/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
END {
         for (key in vals)
          print key vals[key]
}' file.txt

Ожидаемый результат:

App 1170 186 1171 1484 1227 204 1180 1177 1183 1155

Выход будет:

App 1 186 1 1 1 204 1 1 1 1

Как преобразовать вышеприведенный шаблон 's' в 'ms', если появится второй шаблон.

Ответы [ 2 ]

5 голосов
/ 16 мая 2019

Здесь я попытаюсь объяснить, что это немного обобщенно, а затем применить его к вашему делу.

Вопрос: У меня есть строка вида 123a456b7c8d, где числа представляют собой числовые целые значения любой длины, а буквы - соответствующие единицы. У меня также есть коэффициенты пересчета из единицы a,b,c,d в единицу f. Как я могу преобразовать это в единое количество единиц f?

Пример: от 1s183ms до 1183ms

Стратегия:

  1. создать для каждой строки набор пар ключ-значение 'a' => 123, 'b' => 456, 'c' => 7 и 'd' => 8
  2. умножить каждое значение на коэффициент пересчета corect
  3. сложить числа вместе

Предположим, что мы используем awk, а пары ключ-значение хранятся в массиве a с ключом в качестве индекса.

  1. Извлечение пар ключ-значение из str:

    function extract(str,a,   t,k,v) {
       delete a; t=str; 
       while(t!="") { 
          v=t+0; match(t,/[a-zA-Z]+/); k=substr(t,RSTART,RLENGTH);
          t=substr(t,RSTART+RLENGTH);
          a[k]=v
       }
       return
     }
    
  2. преобразование и сумма: здесь мы предполагаем, что у нас есть массив f, который содержит коэффициенты преобразования:

    function convert(a,f,  t,k) {
       t=0; for(k in a) t+=a[k] * f[k]
       return t
    }
    
  3. Полный код (на примере ОП)

    # set conversion factors
    BEGIN{ f['s']=1000; f['ms'] = 1 }
    # print first word
    BEGIN{ printf "App:" }
    # extract string and print
    /^App/ { extract($2,a); printf OFS "%dms", convert(a,f) }
    END { printf ORS }
    

который выводит:

 App: 1170ms 186ms 1171ms 1484ms 1227ms 204ms 1180ms 1177ms 1183ms 1155ms
1 голос
/ 16 мая 2019
perl -n -e '$s=0; ($s)=/(\d+)s/; ($ms)=/(\d+)ms/;
            s/^(\w+):/push @{$vals{$1}}, $ms+$s*1000/e;
            eof && print "$_: @{$vals{$_}}\n" for keys %vals;' file`
  • perl -n ничего не печатает, поскольку проходит через вход.
  • $s и $ms установлены в эти поля. $s гарантированно обнуляется
  • s///e заполняет хеш %vals списком чисел в мс для каждого ключа, в данном случае App.
  • eof && выполняет последующий код после конца файла.
  • print "$_: @{$vals{$_}}\n" for keys %vals печатает хеш %vals так, как хочет OP.

Приложение: 1170 186 1171 1484 1227 204 1180 1177 1183 1155

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...