web-dev-qa-db-fra.com

Vérifier si le bloc a un motif unique

J'ai un fichier avec un nombre de 'blocs' (trois blocs dans cet exemple) qui ressemble à ceci:

A4_RAT  Amyloid-beta A4 protein;    P08592  PDB; 1M7E; X-ray; 2.45 A; D/E/F=755-763.
                                    PDB; 1NMJ; NMR; -; A=672-699.
                                    PDB; 1OQN_I3P.pdb; X-ray; 2.30 A; C/D=755-763.
                                    PDB; 2LI9; NMR; -; A/B=672-687.

AACP_AGRFC  Aminoacyl carrier protein;  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 2''-aminoglycoside nucleotidyltransferase;  P0AE05  PDB; 4WQK; X-ray; 1.48 A; A=1-177.
                                    PDB; 4WQL; X-ray; 1.73 A; A=1-177.
                                    PDB; 5KQJ_GOL.pdb; NMR; -; A=1-177.

Chaque bloc contient PDB;, XXXX/XXXX_XXX.pdb;, Xray/NMR; colonnes. Parmi les deux dernières colonnes de la phrase précédente (XXXX; ou XXXX_XXX.pdb; et X-ray; or NMR;), il existe plusieurs options que je rencontre dans chaque bloc:

XXXX;X-ray;
XXXX_XXX.pdb;X-ray;
XXXX;NMR;
XXXX_XXX.pdb;NMR;

J'essaie de ne rechercher que les "blocs" qui n'ont que XXXX_XXX.pdb; X-ray; et uniquement ceux qui ne contiennent que XXXX_XXX.pdb; NMR;.

À partir de l'exemple ci-dessous, si je recherche ceux qui n'ont que XXXX_XXX.pdb; X-ray;, j'attends que le résultat soit:

A4_RAT  Amyloid-beta A4 protein;    P08592  PDB; 1M7E; X-ray; 2.45 A; D/E/F=755-763.
                                    PDB; 1NMJ; NMR; -; A=672-699.
                                    PDB; 1OQN_I3P.pdb; X-ray; 2.30 A; C/D=755-763.
                                    PDB; 2LI9; NMR; -; A/B=672-687.

AACP_AGRFC  Aminoacyl carrier protein;  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.

Par contre, si je recherche ceux qui ont seulement XXXX_XXX.pdb; NMR; j’attends que le résultat soit:

AADB1_KLEPN 2''-aminoglycoside nucleotidyltransferase;  P0AE05  PDB; 4WQK; X-ray; 1.48 A; A=1-177.
                                    PDB; 4WQL; X-ray; 1.73 A; A=1-177.
                                    PDB; 5KQJ_GOL.pdb; NMR; -; A=1-177.

Est-ce que quelqu'un a une idée de comment le faire en bash?

3
sergio

En supposant que vous avez des lignes vides entre chaque bloc comme vous le montrez dans votre question, donc:

$ awk -v RS='\n\n' '/...._...\.pdb; NMR;/' RS= infile
AADB1_KLEPN 2''-aminoglycoside nucleotidyltransferase;  P0AE05  PDB; 4WQK; X-ray; 1.48 A; A=1-177.
                                    PDB; 4WQL; X-ray; 1.73 A; A=1-177.
                                    PDB; 5KQJ_GOL.pdb; NMR; -; A=1-177.

$ awk -v RS='\n\n' '/...._...\.pdb; X-ray;/' RS= infile
A4_RAT  Amyloid-beta A4 protein;    P08592  PDB; 1M7E; X-ray; 2.45 A; D/E/F=755-763.
                                    PDB; 1NMJ; NMR; -; A=672-699.
                                    PDB; 1OQN_I3P.pdb; X-ray; 2.30 A; C/D=755-763.
                                    PDB; 2LI9; NMR; -; A/B=672-687.
AACP_AGRFC  Aminoacyl carrier protein;  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.

Pour conserver les lignes vides, supprimez RS= et ajoutez l'instruction {print $0"\n"}:

$ awk -v RS='\n\n' '/...._...\.pdb; NMR;/{print $0"\n"}' infile
$ awk -v RS='\n\n' '/...._...\.pdb; X-ray;/{print $0"\n"}' infile
2
αғsнιη