Conte o padrão e as linhas correspondentes simultaneamente

1

Eu quero contar a ocorrência de um padrão por linha e também obter o último número de linha correspondente

Então, para contar padrões, eu usaria

grep -c pattern file

e para o último número de linha correspondente

grep -n pattern file | cut -d : -f 1 | tail -1

Existe alguma maneira pela qual recebo ambos os resultados apenas uma vez? O arquivo com o qual estou trabalhando é grande e preciso iterar isso para vários padrões, portanto, gostaria de evitar o greping duas vezes.

    
por Sourav 17.01.2017 / 15:59

1 resposta

4

Você pode usar awk em vez de grep :

awk '/pattern/ {last = NR; count++}
     END {printf "Last: %s\nCount: %d\n", last, count}' < file

Tenha em atenção que os padrões awk são expressões regulares estendidas (com pequenas diferenças com grep -E as barras wrt backslash).

Você também pode usar apenas uma invocação de awk para todos os seus padrões:

awk '!patterns_finished{patterns[$0]; next}
     {
       for (p in patterns) if ($0 ~ p) {
         last[p] = NR
         count[p]++
       }
     }
     END {
       for (p in patterns)
         printf "%s: count=%d last=%s\n", count[p], last[p]
     }' patterns.txt patterns_finished=1 file

(assumindo patterns.txt contém a lista de padrões, um por linha).

    
por 17.01.2017 / 16:08