Relatório de coleta para padrão definido no Unix usando grep & awk?

0

Eu tenho um arquivo como este:

abc:: vvnm\/asj\/pqr
 sadnck
 acdsd
abc:: kfjwej\/asj\/pqr
 frtrt
 ewrfe
 adsf
abc:: flkm\/csj\/lqr
abc:: kmflkm\/asj\/pqr
 sdvd
 dfff

Eu quero produzir assim [depois de: abc, count cell]

3 kfjwej/asj/pqr
2 vvnm/asj/pqr
2 kmflkm/asj/pqr
0 flkm/csj/lqr
    
por Saurabh Shukla 18.07.2018 / 12:51

2 respostas

1

awk solução:

awk '/^[0-9]+:abc /{
         if (abc) print count abc;
         sub(/^[0-9]+/, "");
         abc = $0; count = 0; next
     }
     abc{ count++ }
     END{ print count abc }' file

A saída:

2:abc vvvvv
3:abc kfjwej
2:abc kmflkm

Mais (e última) abordagem para o novo formato de arquivo usando awk arquivo-fonte :

Script

count_abc.awk :

#!/bin/awk -f
/^abc::/{ 
    if (abc) print count, abc;
    gsub(/\/, "", $2);
    abc = $2; count = 0; next 
}
abc { count++ }
END { print count, abc }

Uso:

awk -f count_abc.awk newfile

A saída:

2 vvnm/asj/pqr
3 kfjwej/asj/pqr
2 kmflkm/asj/pqr 
    
por 18.07.2018 / 13:33
0

Usando uma combinação de sed , uniq e awk :

$ sed '/^[^[:space:]]/{s/^[^[:space:]]* //g;s#\##g;h;}; g' file | uniq -c | awk '{ $1 -= 1; print }'
2 vvnm/asj/pqr
3 kfjwej/asj/pqr
0 flkm/csj/lqr
2 kmflkm/asj/pqr

O script sed , anotado:

/^[^[:space:]]/{             # this line starts with a non-space
    s/^[^[:space:]]* //;     # remove the thing that is not a space, up to the space
    s#\##g;                 # remove backslashes
    h;                       # store in hold space
};

g;                           # get hold space
                             # (implicit print)

O que isto faz é substituir cada "linha de sub-cabeçalho" por sua "linha de cabeçalho" correspondente, gerando

vvnm/asj/pqr
vvnm/asj/pqr
vvnm/asj/pqr
kfjwej/asj/pqr
kfjwej/asj/pqr
kfjwej/asj/pqr
kfjwej/asj/pqr
flkm/csj/lqr
kmflkm/asj/pqr
kmflkm/asj/pqr
kmflkm/asj/pqr

Em seguida, permitimos que uniq conte o número de linhas únicas consecutivas, gerando

   3 vvnm/asj/pqr
   4 kfjwej/asj/pqr
   1 flkm/csj/lqr
   3 kmflkm/asj/pqr

Com awk , nós simplesmente decrementamos o número no primeiro campo disto.

    
por 18.07.2018 / 17:19

Tags