com awk
:
$ awk '!/X/{count++}/X/{print count; count = 0}' input
3
4
1
Incremente uma contagem para cada linha que não contenha X
; imprima e redefina a contagem de linhas contendo X
.
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. Ficarei grato se você puder sugerir algum comando, de preferência usando awk
, grep
ou sed
, já que estou familiarizado com eles.
Exemplo:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Saída desejada:
3
4
1
com awk
:
$ awk '!/X/{count++}/X/{print count; count = 0}' input
3
4
1
Incremente uma contagem para cada linha que não contenha X
; imprima e redefina a contagem de linhas contendo X
.
$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1
Como funciona:
O awk lê implicitamente os arquivos de entrada linha a linha.
/X/ && prev{print NR-prev-1}
Para qualquer linha que contenha X
e se tivermos atribuído um valor a prev
, imprima o número da linha atual, NR
, menos prev
menos um.
/X/{prev=NR}
Para qualquer linha que contenha X
, defina a variável prev
para o número da linha atual, NR
.
Outra abordagem simples de awk
que funciona nos dados de amostra do OP e se X
não foi no primeiro ou até no Xs passado ou repetido.
awk -v RS='X' 'NF{print NF}' infile
Acima está correto quando há apenas um campo em cada linha com o padrão FS qualquer espaços em branco , caso contrário, abaixo é revisado, em geral, para contar linewise . Você pode inserir seu PATTERN no lugar de X .
awk -F'\n' -v RS='X' 'NF>2{print NF-2}'
Exemplo de entrada:
X
Y YYY Y
YY
YY Y YY YY Y Y
X
Y Y Y
X
Y
Y
X
X
A saída é:
3
1
2
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 strings de fato. Por isso, proponho o seguinte script Awk como uma variante da resposta do muru :
BEGIN {
count = 0;
}
{
if ($0 == needle) {
if (count) {
print count;
count = 0;
}
} else {
count++;
}
}
Armazene como um arquivo de texto, e. g. count-rows.awk
e invoque da seguinte forma:
awk -f count-rows.awk -v needle=X input
Você pode ajustar o valor de needle
ao seu gosto. A vantagem deste método é que você pode invocar o programa a partir de um script de shell com um valor arbitrário para needle
sem problemas de escape:
awk -f count-rows.awk -v needle="$needle" input