Grep que trabalha com padrões sobrepostos

4

Eu quero contar o número de padrões de repetição aa em um arquivo muito grande. Então eu uso o seguinte comando:

grep -o "aa" ./bwt/dblp.txt | wc -l

Isso funciona, exceto quando eu tenho uma string como aaa , que então corresponde a apenas 1 padrão. No meu caso de uso, preciso que os primeiros 2 a s signifiquem um padrão, mas os últimos 2 a s sejam um segundo padrão (isso significa que o a do meio de aaa pode ser reutilizado). / p>

Como posso conseguir isso?

Por favor, note que o arquivo é muito grande, então uma maneira "otimizada", se possível, seria melhor. De qualquer forma, qualquer solução de trabalho é obviamente bem-vinda.

    
por testTester 13.04.2016 / 14:07

3 respostas

3

Você precisa de expressões regulares perl para isso. Com um grep que suporta o sinalizador -P :

grep -oP '(?<=a)a' file | wc -l

Este é um lookbehind positivo. Ele corresponde a um único a , que é precedido por outro a .

Se você preferir perl (ou seu grep não suporta o -P flag):

perl -ne 'while(m/(?<=a)a/g){$a++}END{print "$a\n"}' file

Exemplo:

$ cat file
aa
aaa
aaaa

A primeira linha deve ser 1 correspondência, a segunda 2 e a terceira árvore; todos juntos 6:

$ grep -oP '(?<=a)a' file | wc -l
6
    
por 13.04.2016 / 14:25
2

Você pode contar pares de letras repetidos, como o exemplo aa em um arquivo de dados big_file , assim:

tr -cs a '2' <big_file | awk '/aa/{n += length - 1}; END {print n+0}'

A linha pode ser explicada assim

  • O tr altera qualquer sequência de caracteres que não seja a em uma nova linha. Isso divide várias ocorrências de aa... em linhas separadas
  • O awk conta o comprimento de linhas diferentes de zero. Usando a propriedade que uma sequência de N caracteres contém N-1 pares sobrepostos, pode somar o número de pares sobrepostos e produzir um total no final do arquivo

Na verdade, como o arquivo é "muito grande", você obtém uma resposta melhor incluindo um grep no pipeline da seguinte forma:

tr -cs a '2' <big_file | grep aa | awk '{n += length - 1}; END {print n+0}'
    
por 13.04.2016 / 14:36
-2
grep -ow aa ./bwt/dblp.txt | wc -l
    
por 13.04.2016 / 14:54