Eu quero contar as linhas entre "X" s. Este é apenas um exemplo; Eu tenho que aplicar o código a um resultado biológico complexo. Serei grato se você puder sugerir algum comando, de preferência usando awk
, grep
ou sed
como eu estou familiarizado com eles.
Exemplo:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Saída desejada:
3
4
1
Respostas:
Com
awk
:Incremente uma contagem para cada linha que não contém
X
; imprima e redefina a contagem de linhas que contêmX
.fonte
X
, o primeiro número de linhas ainda será contado e emitido com esta solução, até que a primeira linhaX
seja correspondida. EX (Não é possível adicionar novas linhas nos comentários, mas considere que há uma nova linha entre cada caractere; P):Y X Y Y X Y Y Y
geraria:1 2
END{if (count)print count}
), e produzindo linha vazia onde X estava no início para evitar que você pode adicionar/X/&&count
em condição tambémY
s principais não devem ser contados porque não estão exatamente entre doisX
s; o outro reclama queY
s à direita não são contados porque não estão exatamente entre doisX
s. Vou esperar o OP esclarecer, se necessário; Estou bem com esta resposta, até então.Como funciona:
O Awk lê implicitamente os arquivos de entrada linha por linha.
/X/ && prev{print NR-prev-1}
Para qualquer linha que contenha
X
e se tivermos atribuído um valor anteriormenteprev
, imprima o número da linha atualNR
,prev
menos um./X/{prev=NR}
Para qualquer linha que contenha
X
, defina a variávelprev
como o número da linha atualNR
,.fonte
NR
me dá uma idéia:awk '/X/{print NR - 1; NR = 0}' foo
X
, há uma pequena diferença na saída entre as 2 respostas, como expliquei em um comentário na resposta de muru.Outra
awk
abordagem simples que funciona com os dados de amostra do OP e seX
não estava no primeiro ou mesmo no último ou repetido Xs.Acima está correto quando existe apenas um campo em cada linha com FS padrão, quaisquer espaços em branco , caso contrário, a seguir é revisada em geral para contagem em linha . Você pode inserir seu PATTERN no lugar de X lá.
Entrada de amostra:
A saída é:
fonte
A maioria das respostas aqui corresponde ao conteúdo da linha a ser contada usando expressões regulares incorporadas ao programa Awk. Se você precisar combinar linhas com conteúdo que possa conter caracteres especiais (para Awk ou expressões regulares), seria melhor comparar as seqüências de caracteres para obter a igualdade. Portanto, proponho o seguinte script do Awk como uma variante da resposta de muru :
Armazene-o como um arquivo de texto, por exemplo
count-rows.awk
, e chame-o da seguinte maneira:Você pode ajustar o valor
needle
ao seu gosto. A vantagem desse método é que você pode invocar o programa a partir de um script de shell com um valor arbitrário,needle
sem problemas de escape:fonte