Grep: conta o número de correspondências por linha

20

Estou tentando obter o número de correspondências (neste caso, ocorrências de { ou } ) em cada linha de um arquivo .tex.

Eu sei que o -o sinalizador retorna apenas a correspondência, mas retorna cada correspondência em uma nova linha, mesmo combinada com o -n sinalizador. Eu não sei de nada que eu possa canalizar para contar as repetições. O -c flag só retorna o número total de correspondências em todo o arquivo - talvez eu pudesse canalizar uma linha de cada vez para grep?

    
por Chris H 16.06.2014 / 12:03

3 respostas

19
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

A saída será algo como:

3 1
1 2

Significado 3 ocorrências na primeira linha e 1 na segunda.

Extraído do link .

    
por 16.06.2014 / 12:34
3

Depois de ler várias soluções, acho que essa é a abordagem mais fácil para o problema:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt
    
por 25.08.2015 / 23:06
1

Está usando grep um requisito? Aqui está uma alternativa:

sed 's/[^{}]//g' your_file | awk '{print NR, length }'

O sed retira todos os caracteres que não sejam { e } (isto é, deixando apenas { e } caracteres), e, em seguida, o awk conta os caracteres em cada linha (que são apenas os caracteres { e } ). Para suprimir linhas sem correspondências,

sed 's/[^{}]//g' your_file | awk '/./ {print NR, length }'

Observe que minha solução assume (requer) que as strings que você está procurando sejam caracteres únicos. A resposta de Moebius é mais facilmente adaptada para strings com vários caracteres. Além disso, nenhuma das nossas respostas exclui ocorrências citadas ou escapadas dos caracteres / cadeias de interesse; por exemplo,

{ "nullfunc() {}" }

seria considerado como contendo quatro caracteres de chave.

    
por 16.06.2014 / 17:35

Tags