Verificando se cada 'bloco' tem menos de 5 linhas com caractere específico

0

Eu tenho um arquivo que tem 5 'blocos' e se parece com isso:

AACP_AGRFC  Agrobacterium fabrum    A9CHM9  PDB; 2JQ4; NMR; -; A=1-83.
                    PDB; 4H2W_5GP.pdb; X-ray; 1.95 A; C/D=1-83.
                    PDB; 4H2X_G5A.pdb; X-ray; 2.15 A; C/D=1-83.
                    PDB; 4H2Y; X-ray; 2.10 A; C/D=1-83.

AADB1_KLEPN Klebsiella pneumoniae.  P0AE05  PDB; 4WQK_GOL.pdb; X-ray; 1.48 A; A=1-177.
                    PDB; 4WQL_GOL.pdb; X-ray; 1.73 A; A=1-177.
                    PDB; 5KQJ; NMR; -; A=1-177.

AAKB2_RAT   Rattus norvegicus   Q9QZH4  PDB; 2LU3; NMR; -; A=67-163.
                    PDB; 2LU4; NMR; -; A=67-163.
                    PDB; 4Y0G_GOL.pdb; X-ray; 1.60 A; A/B=74-155.
                    PDB; 4YEE_GOL.pdb; X-ray; 2.00 A; A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R=74-155.

AAPK2_HUMAN Homo sapiens    P54646  PDB; 2H6D; X-ray; 1.85 A; A=6-279.
                    PDB; 2LTU; NMR; -; A=282-339.
                    PDB; 2YZA; X-ray; 3.02 A; A=6-279.
                    PDB; 3AQV_TAK.pdb; X-ray; 2.08 A; A=6-279.
                    PDB; 4CFE; X-ray; 3.02 A; A/C=1-552.
                    PDB; 4CFF; X-ray; 3.92 A; A/C=1-552.
                    PDB; 4ZHX_4O7_C1V_C2Z.pdb; X-ray; 2.99 A; A/C=2-552.
                    PDB; 5EZV_C1V_C2Z_STU.pdb; X-ray; 2.99 A; A/C=2-347, A/C=397-552.
                    PDB; 5ISO_992_STU.pdb; X-ray; 2.63 A; A/C=1-552.

ABC3B_HUMAN Homo sapiens    Q9UH17  PDB; 2NBQ; NMR; -; A=187-382.
                    PDB; 5CQD_GOL.pdb; X-ray; 2.08 A; A/C=187-378.
                    PDB; 5CQH; X-ray; 1.73 A; A=187-378.
                    PDB; 5CQI; X-ray; 1.68 A; A=187-378.
                    PDB; 5CQK_GOL_PGE.pdb; X-ray; 1.88 A; A=187-378.
                    PDB; 5TD5; X-ray; 1.72 A; A=187-378.
                    PDB; 5TKM; X-ray; 1.90 A; A/B=1-191.

Cada linha é diferente em tamanho, mas estamos procurando apenas por coluna específica, estamos olhando para colunas onde estão X-ray e NMR (eles estão sempre na mesma coluna) e queremos verificar se em cada bloco 'há >=5 linhas que sob essa coluna tem X-ray . Se for esse o caso, queremos imprimir esse bloco. Se não for o caso, queremos remover o bloco inteiro. Assim, o resultado esperado deve ser assim:

AAPK2_HUMAN Homo sapiens    P54646  PDB; 2H6D; X-ray; 1.85 A; A=6-279.
                    PDB; 2LTU; NMR; -; A=282-339.
                    PDB; 2YZA; X-ray; 3.02 A; A=6-279.
                    PDB; 3AQV_TAK.pdb; X-ray; 2.08 A; A=6-279.
                    PDB; 4CFE; X-ray; 3.02 A; A/C=1-552.
                    PDB; 4CFF; X-ray; 3.92 A; A/C=1-552.
                    PDB; 4ZHX_4O7_C1V_C2Z.pdb; X-ray; 2.99 A; A/C=2-552.
                    PDB; 5EZV_C1V_C2Z_STU.pdb; X-ray; 2.99 A; A/C=2-347, A/C=397-552.
                    PDB; 5ISO_992_STU.pdb; X-ray; 2.63 A; A/C=1-552.

ABC3B_HUMAN Homo sapiens    Q9UH17  PDB; 2NBQ; NMR; -; A=187-382.
                    PDB; 5CQD_GOL.pdb; X-ray; 2.08 A; A/C=187-378.
                    PDB; 5CQH; X-ray; 1.73 A; A=187-378.
                    PDB; 5CQI; X-ray; 1.68 A; A=187-378.
                    PDB; 5CQK_GOL_PGE.pdb; X-ray; 1.88 A; A=187-378.
                    PDB; 5TD5; X-ray; 1.72 A; A=187-378.
                    PDB; 5TKM; X-ray; 1.90 A; A/B=1-191.

PS. Não podemos usar ; como um delimitador para colunas, mas sabemos que essas colunas, onde X-ray e NMR estão localizadas, são sempre PDB; XXXX(.pdb); X-ray or NMR .

Alguém tem uma ideia de como isso pode ser feito em bash? Obrigado

    
por sergio 08.03.2018 / 09:43

1 resposta

3

Assumindo que seu critério pode ser expresso como o número de linhas que correspondem à expressão regular /PDB; [^;]*; X-ray/ , você pode fazer algo como

awk -vRS= -F'\n' '
  {c=0; for(i=1;i<=NF;i++) c += $i ~ /PDB; [^;]*; X-ray/ ? 1 : 0} c >= 5
'

ou (ligeiramente mais limpo, IMHO)

perl -F'\n' -00ne 'print unless (grep { /PDB; [^;]*; X-ray/ } @F) < 5'

Ex.

$ perl -F'\n' -00ne 'print unless (grep { /PDB; [^;]*; X-ray/ } @F) < 5' file
AAPK2_HUMAN Homo sapiens    P54646  PDB; 2H6D; X-ray; 1.85 A; A=6-279.
                    PDB; 2LTU; NMR; -; A=282-339.
                    PDB; 2YZA; X-ray; 3.02 A; A=6-279.
                    PDB; 3AQV_TAK.pdb; X-ray; 2.08 A; A=6-279.
                    PDB; 4CFE; X-ray; 3.02 A; A/C=1-552.
                    PDB; 4CFF; X-ray; 3.92 A; A/C=1-552.
                    PDB; 4ZHX_4O7_C1V_C2Z.pdb; X-ray; 2.99 A; A/C=2-552.
                    PDB; 5EZV_C1V_C2Z_STU.pdb; X-ray; 2.99 A; A/C=2-347, A/C=397-552.
                    PDB; 5ISO_992_STU.pdb; X-ray; 2.63 A; A/C=1-552.

ABC3B_HUMAN Homo sapiens    Q9UH17  PDB; 2NBQ; NMR; -; A=187-382.
                    PDB; 5CQD_GOL.pdb; X-ray; 2.08 A; A/C=187-378.
                    PDB; 5CQH; X-ray; 1.73 A; A=187-378.
                    PDB; 5CQI; X-ray; 1.68 A; A=187-378.
                    PDB; 5CQK_GOL_PGE.pdb; X-ray; 1.88 A; A=187-378.
                    PDB; 5TD5; X-ray; 1.72 A; A=187-378.
                    PDB; 5TKM; X-ray; 1.90 A; A/B=1-191.
    
por steeldriver 08.03.2018 / 10:28