Contagem de linhas entre “X” s

13

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
    
por Rhea 08.09.2017 / 08:45

4 respostas

13

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 .

    
por muru 08.09.2017 / 08:52
12
$ 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 .

por John1024 08.09.2017 / 08:52
6

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
    
por αғsнιη 08.09.2017 / 10:10
1

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
    
por David Foerster 09.09.2017 / 12:18