Como apagar linhas onde determinado padrão aparece na posição específica

0

Estou com um arquivo assim:

PEBP1_HUMAN Homo sapiens    P30086  PDB; 1BD9; X-ray; 2.05 A; A/B=1-187.
                    PDB; 1BEH; X-ray; 1.75 A; A/B=1-187.
                    PDB; 2L7W; NMR; -; A=1-187.
                    PDB; 2QYQ; X-ray; 1.95 A; A=1-187.

PECA1_HUMAN Homo sapiens    P16284  PDB; 2KY5; NMR; -; A=686-738.
                    PDB; 5C14; X-ray; 2.80 A; A/B=28-229.
                    PDB; 5GEM; X-ray; 3.01 A; A/B=28-232.

PELO_HUMAN  Homo sapiens    Q9BRX2  PDB; 1X52; NMR; -; A=261-371.
                    PDB; 5EO3; X-ray; 2.60 A; A/B=265-385.
                    PDB; 5LZW; EM; 3.53 A; ii=1-385.
                    PDB; 5LZX; EM; 3.67 A; ii=1-385.
                    PDB; 5LZY; EM; 3.99 A; ii=1-385.
                    PDB; 5LZZ; EM; 3.47 A; ii=1-385.

Nesse arquivo, quero corresponder todos os elementos EM; encontrados logo após PDB; (four letter code); EM; . Portanto, sob essa coluna, X-ray; , NMR; ou EM; pode ser encontrado. Para as linhas que têm EM; , remova-as. Existe algum comando bash que eu possa usar para combinar esses elementos e remover essas linhas?

É importante que, ao fazer a correspondência, coloque o espaço antes de EM , portanto, combine-o com espaço, como EM; .

O resultado esperado é:

PEBP1_HUMAN Homo sapiens    P30086  PDB; 1BD9; X-ray; 2.05 A; A/B=1-187.
                    PDB; 1BEH; X-ray; 1.75 A; A/B=1-187.
                    PDB; 2L7W; NMR; -; A=1-187.
                    PDB; 2QYQ; X-ray; 1.95 A; A=1-187.

PECA1_HUMAN Homo sapiens    P16284  PDB; 2KY5; NMR; -; A=686-738.
                    PDB; 5C14; X-ray; 2.80 A; A/B=28-229.
                    PDB; 5GEM; X-ray; 3.01 A; A/B=28-232.

PELO_HUMAN  Homo sapiens    Q9BRX2  PDB; 1X52; NMR; -; A=261-371.
                    PDB; 5EO3; X-ray; 2.60 A; A/B=265-385.
    
por sergio 06.03.2018 / 12:06

2 respostas

1

awk pode fazer isso:

awk '{if(!($1=="PDB;"&&$3=="EM;")){print}}' <yourfile

Isso testa se a primeira coluna (por padrão, os espaços em branco são tomados como o delimitador) da linha atual é PDB; e a terceira coluna é EM; e imprime a linha somente se não ambas forem verdadeiras.

Saída

$ awk '{if(!($1=="PDB;"&&$3=="EM;")){print}}' <test
PEBP1_HUMAN Homo sapiens    P30086  PDB; 1BD9; X-ray; 2.05 A; A/B=1-187.
                    PDB; 1BEH; X-ray; 1.75 A; A/B=1-187.
                    PDB; 2L7W; NMR; -; A=1-187.
                    PDB; 2QYQ; X-ray; 1.95 A; A=1-187.

PECA1_HUMAN Homo sapiens    P16284  PDB; 2KY5; NMR; -; A=686-738.
                    PDB; 5C14; X-ray; 2.80 A; A/B=28-229.
                    PDB; 5GEM; X-ray; 3.01 A; A/B=28-232.

PELO_HUMAN  Homo sapiens    Q9BRX2  PDB; 1X52; NMR; -; A=261-371.
                    PDB; 5EO3; X-ray; 2.60 A; A/B=265-385.
    
por dessert 06.03.2018 / 12:17
1

Você poderia fazer algo assim - usando o modo de parágrafo do perl:

$ perl -F'\n' -00le 'print join "\n", grep { !/PDB; ....; EM;/ } @F' file
PEBP1_HUMAN Homo sapiens    P30086  PDB; 1BD9; X-ray; 2.05 A; A/B=1-187.
                    PDB; 1BEH; X-ray; 1.75 A; A/B=1-187.
                    PDB; 2L7W; NMR; -; A=1-187.
                    PDB; 2QYQ; X-ray; 1.95 A; A=1-187.

PECA1_HUMAN Homo sapiens    P16284  PDB; 2KY5; NMR; -; A=686-738.
                    PDB; 5C14; X-ray; 2.80 A; A/B=28-229.
                    PDB; 5GEM; X-ray; 3.01 A; A/B=28-232.

PELO_HUMAN  Homo sapiens    Q9BRX2  PDB; 1X52; NMR; -; A=261-371.
                    PDB; 5EO3; X-ray; 2.60 A; A/B=265-385.
    
por steeldriver 06.03.2018 / 13:18