Как удалить строки, где определенный шаблон появляется на определенном положении

У меня есть файл, который похож на это:

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.

Из этого файла я хочу соответствовать всем EM; элементы, которые найдены сразу после PDB; (four letter code); EM;. Таким образом под этим столбцом также X-ray;, NMR; или EM; может быть найден. Для тех строк, которые имеют EM; удалите их. Есть ли некоторый удар, управляют, чтобы я мог использовать, чтобы соответствовать этим элементам и удалить эти строки?

Значительно, когда соответствие ему поместило пространство прежде EM, так соответствуйте ему пространству, как EM;.

Ожидаемый результат:

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.
0
задан 6 March 2018 в 05:26

2 ответа

awk может сделать это:

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

Это тестирует, если первый столбец (пробелами по умолчанию взяты в качестве разделителя) текущей строки PDB; и третий столбец EM; и печатает строку, только если не оба верны.

Вывод

$ 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.
1
ответ дан 30 October 2019 в 07:57

Вы могли сделать что-то вроде этого - использование режима абзаца 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.
1
ответ дан 30 October 2019 в 07:57

Другие вопросы по тегам:

Похожие вопросы: