Объединить совпадающую строку и столбец суммы в сценарии оболочки - PullRequest
0 голосов
/ 04 июля 2019

Я хочу подсчет суммы, если первое слово соответствует в строке URL. например мой желаемый вывод должен содержать сумму и первое слово в URL

Count   Response    Url
3   400 data.internal.example.com
18  400 homeloans.internal.example.com
4   400 login.internal.example.com
465 400 login.internal.example.com
3   400 regions.internal.example.com
5   400 search.example.com
6   400 search.example.com
30  400 search.example.com
2   400 search.example.com
1   400 search.internal.example.com
1   422 login.example.com
1   422 login.example.com
139 422 newprojects.internal.example.com
1   422 notification.example.com
1   500 example.com
1   500 search.example.com

Получено выше из файла журнала с использованием кода ruby ​​и команд оболочки

result = `ruby -lane 'puts $F.values_at(9,8).join( \"\ \" )' #{@logfile} | grep -E '500\|502\|504\|400\|422\|409\|405'| grep -v "200" |grep -v "Nagar" | grep -v "Colony" |grep -v "Phase" | grep -v "Sector" | grep -v "Road" | grep -v "ignore_protected" |grep -v "LYF_LS_4002" | grep -v "utm_dynamicid" |sort |uniq -c`

Ниже должен быть вывод -

Count   Response    Url
3   400 data
18  400 homeloans
469 400 login
3   400 regions
44  400 search
2   422 login
139 422 newprojects
1   422 notification
1   500 example.com
1   500 search.example.com

Ответы [ 3 ]

0 голосов
/ 04 июля 2019

Версия Perl, с отсортированным выводом:

$ perl -lane 'next if $. == 1; # Skip header line
            $F[2] =~ s/^[^.]+\K.*//; $recs{$F[1]}{$F[2]} += $F[0];
            END { $, = "\t"; print "Count", "Response", "URL";
                  for $resp (sort keys %recs) {
                    for $url (sort keys %{$recs{$resp}}) {
                      print $recs{$resp}{$url}, $resp, $url
            }}}' input.txt
Count   Response    URL
3   400 data
18  400 homeloans
469 400 login
3   400 regions
44  400 search
2   422 login
139 422 newprojects
1   422 notification
1   500 example
1   500 search

И короткая и приятная версия с использованием GNU datamash (в этом предполагается, что столбцы разделены табуляцией; добавьте -W к параметрам datamash, если нет).

$ cut -d. -f1 input.txt | datamash -Hs groupby 2,3 sum 1 
GroupBy(Response)   GroupBy(Url)    sum(Count)
400 data    3
400 homeloans   18
400 login   469
400 regions 3
400 search  44
422 login   2
422 newprojects 139
422 notification    1
500 example 1
500 search  1

Выходные столбцы расположены в другом порядке, а заголовки - разные, но их легко настроить с помощью awk или чего-либо еще, если нужно.

0 голосов
/ 08 июля 2019

Я смог сделать, используя строку ниже -

ruby -lane 'puts $F.values_at(9,8).join( \"\ \" )' \#{@logfile} | grep -E '500\|502\|504\|400\|422\|409\|405'| grep -v "200" |grep -v "Nagar" | grep -v "Colony" |grep -v "Phase" | grep -v "Sector" | grep -v "Road" | grep -v "ignore_protected" |grep -v "LYF_LS_4002" | grep -v "utm_dynamicid" |sort | cut -f1 -d "."| awk '{print $2 " service ---  " $1 " response"}'| sort |uniq -c
0 голосов
/ 04 июля 2019

Вот один в awk:

$ awk '
NR==1 {
    print                                                  # print header
    next
}
{
    split($3,t,".")                                        # split the first word
    len=length(a[$2 " " t[1]]+=$1)                         # get the max length of
    if(len>max)                                            # counts for pretty print
        max=len                                               
}
END {
    for(i in a) {
        split(a[i],t," ")                                  # separate response and word
        printf "%s%" max-length(t[1]) "s %s\n",t[1],t[2],i # output
    }
}' file

Записи будут выводиться в, казалось бы, случайном порядке:

Count   Response    Url
3   400 regions
3   400 data
1   500 example
1   422 notification
139 422 newprojects
1   500 search
44  400 search
18  400 homeloans
2   422 login
469 400 login

Если вы хотите упорядоченный вывод (по ответу и первому слову), используйте GNU awk и добавьте PROCINFO["sorted_in"]="@ind_str_asc" в начало блока END{}.

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