Quantas vezes na primeira coluna de um arquivo parece ter qualquer letra / número?

0

Olá, eu tenho um arquivo que se parece com isso:

ZC12A_MOUSE Mus musculus    Q5D1E7  PDB; 2N5J; NMR; -; A=45-89.
                    PDB; 2N5K; NMR; -; A=299-327.
                    PDB; 2N5L; NMR; -; A=544-596.
                    PDB; 5H9V; X-ray; 2.75 A; A/B/C/D=134-339.
                    PDB; 5H9W; X-ray; 2.60 A; A/B=134-339.

ZHX1_HUMAN  Homo sapiens    Q9UKY1  PDB; 2ECB; NMR; -; A=565-640.
                    PDB; 2GHF; NMR; -; A=60-153.
                    PDB; 2LY9; NMR; -; A=462-532.
                    PDB; 3NAR; X-ray; 2.60 A; A/B=655-731.

ZHX2_HUMAN  Homo sapiens    Q9Y6X8  PDB; 2DMP; NMR; -; A=524-599.
                    PDB; 3NAU; X-ray; 2.70 A; A/B=444-501.

Estou tentando contar os "blocos" no arquivo (aqui tenho 3). Então eu posso fazer isso, mas contando o número de vezes parece que na primeira coluna há alguma letra / número? Existe algum comando bash que eu poderia usar?

    
por sergio 05.03.2018 / 10:41

3 respostas

1

É fácil pegar as linhas que não começam com espaços com algo como awk :

$ awk '/^\S/' test
ZC12A_MOUSE Mus musculus    Q5D1E7  PDB; 2N5J; NMR; -; A=45-89.
ZHX1_HUMAN  Homo sapiens    Q9UKY1  PDB; 2ECB; NMR; -; A=565-640.
ZHX2_HUMAN  Homo sapiens    Q9Y6X8  PDB; 2DMP; NMR; -; A=524-599.

Se você quer apenas contar isso, pode canalizar isso para wc -l , que conta as linhas da entrada:

$ awk '/^\S/' test | wc -l
3

Você também pode fazer coisas mais avançadas com o awk - e é por isso que eu escolhi - como separar o primeiro campo das linhas sem espaços em branco iniciais:

$ awk '/^\S/ {print $1}' test
ZC12A_MOUSE
ZHX1_HUMAN
ZHX2_HUMAN

E a partir daí, você pode contar instâncias exclusivas de cada uma delas. A única condição para isso é que você precisa classificá-lo primeiro. Felizmente existem ferramentas para todas essas coisas na instalação básica:

$ awk '/^\S/ {print $1}' test | sort | uniq -c
      1 ZC12A_MOUSE
      1 ZHX1_HUMAN
      1 ZHX2_HUMAN
    
por Oli 05.03.2018 / 10:49
1

Você pode usar grep :

grep -c '^[[:alnum:]]' input-file

^ é o início da linha, [[:alnum:]] corresponde a alfabetos ou números (abreviação de al pha num eric) e -c torna grep imprima a contagem.

    
por Olorin 05.03.2018 / 10:49
1

Se você está trabalhando com arquivos que consistem em registros de múltiplas linhas, então você deve se familiarizar com o awk's modo de parágrafo que é obtido definindo um separador de registro vazio RS .

Por exemplo, para imprimir o número de registros (blocos) em seu arquivo, você pode simplesmente desmarcar RS e depois imprimir o número de registros processados no final:

awk -vRS= 'END {print NR}' file

Se você quiser imprimir o primeiro campo de cada registro de múltiplas linhas que é simplesmente

$ awk -vRS= '{print $1}' file
ZC12A_MOUSE
ZHX1_HUMAN
ZHX2_HUMAN

e assim por diante - sem ter que recorrer à correspondência de expressões regulares.

    
por steeldriver 05.03.2018 / 13:11