У меня есть файл с количеством 'блоков' (три блока в этом примере), которые похожи на это:
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.
Каждый 'блок' имеет PDB;
, XXXX/XXXX_XXX.pdb;
, Xray/NMR;
столбцы. Из последних двух столбцов от предыдущего предложения (XXXX;
или XXXX_XXX.pdb;
и X-ray; or NMR;
) существует несколько опций, с которыми я встречаюсь в каждом блоке:
XXXX;
X-ray;
XXXX_XXX.pdb;
X-ray;
XXXX;
NMR;
XXXX_XXX.pdb;
NMR;
Я пытаюсь искать только те 'блоки', которые имеют только XXXX_XXX.pdb; X-ray;
и только для тех 'блоков', которые имеют только XXXX_XXX.pdb; NMR;
.
От примера здесь, если я делаю поиск тех, которые имеют только XXXX_XXX.pdb; X-ray;
Я ожидаю, что результат будет:
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.
С другой стороны, если я делаю поиск тех, которые имеют только XXXX_XXX.pdb; NMR;
Я ожидаю, что результат будет:
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.
У кого-либо есть идея, как сделать это в ударе?
Asuming у Вас есть пустые строки между каждым блоком, поскольку Вы показываете в своем вопросе, таким образом:
$ 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.
Для сохранения пустых строк удаляют RS=
и добавьте оператор {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