Como posso contar o número de linhas em um arquivo depois de uma correspondência com o grep?

14

Estou tentando contar o número de linhas depois de uma linha problemática em um arquivo csv. Estou ciente de que posso usar a sintaxe grep -a # para gerar # número de linhas depois que uma correspondência for encontrada. Estou interessado apenas no número real de linhas. Eu percebo que eu poderia definir o número para MAX_INT, canalizá-lo em um arquivo e fazer mais algum processamento.

Estou à procura de uma frase de efeito sucinta para apenas me contar a contagem.

Alguma sugestão?

    
por NathanChristie 25.06.2015 / 16:14

5 respostas

15
{ grep -m1 match; grep -c ''; } <file

Isso funcionará com GNU grep e um infil lseek() able. O primeiro grep parará em 1 -m atch e o segundo% em relação a cada linha restante na entrada.

Sem GNU -c :

{ sed '/match/q'; grep -c ''; } <file

Claro, w / grep você pode usar qualquer / todas as suas outras opções além, e parar em uma partida não é de todo necessário.

    
por 25.06.2015 / 16:23
9

Aqui está um jeito.

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$
    
por 25.06.2015 / 16:21
6

Outra maneira - o uso de dc é um pouco esotérico, mas parece funcionar bem aqui:

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sed pesquisa prob.txt para "problema" e a última linha, e usa o comando = para gerar o número da linha de ambos.

dc lê esses dois valores na pilha, os inverte, subtrai e imprime a diferença.

    
por 26.06.2015 / 01:13
5

Totalmente com sed (embora dois comandos com um tubo)

sed '/ddd/,$!d' file | sed -n '$='

Exclui toda a linha antes da linha e, em seguida, o próximo comando conta as linhas no novo arquivo.

    
por 25.06.2015 / 16:43
3

Isso deve excluir todas as linhas até (e incluindo) a problemática e, em seguida, contar as linhas restantes:

sed '1,/problem/d' data.txt | wc -l
    
por 25.06.2015 / 22:58

Tags