удалить строки после указанного c символа | AWK - PullRequest
0 голосов
/ 06 марта 2020

Я пишу сценарий Bash и мне нужно удалить все строки между TER, включая 'TER's

Входной файл:

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H  
TER
ATOM      1 HO5'   A     1       3.429  -7.861   3.641  1.00  0.00           H  
ATOM      2  O5'   A     1       4.232  -7.360   3.480  1.00  0.00           O  
ATOM      3  C5'   A     1       5.480  -8.064   3.350  1.00  0.00           C  
ATOM      4  H5'   A     1       5.429  -8.766   2.518  1.00  0.00           H  
TER

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

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H  

Я нашел

sed '/TER/,$d' ${myArray[j]}.txt >> ${MyArray[j]}.txt  ### ${MyArray[j]} file name through an array 

Но это не работает, я думаю, что awk будет работать с Bash Script. помогите Спасибо

Ответы [ 4 ]

0 голосов
/ 08 марта 2020

awk также предоставляет простое решение с использованием флага для управления печатью. Ниже переменная skip используется в качестве флага. Если 1 строки пропущены, то при переходе от 1 к 0 скрипт завершается.

awk -v skip=0 '$1=="TER"{skip=skip?1:0; if (!skip)exit}1' file

Выше $1=="TER" используется для сопоставления строк (записей), где первое поле равно TER (это устраняет неоднозначность между "TER" и "TERMINAL", et c ...) В рамках правила троичное skip=skip?1:0 устанавливает skip=1 в первый раз, когда "TER" встречается и 0 на следующем. Если skip==0, скрипт завершается. 1 в конце - это просто сокращение для print.

Пример использования / Вывод

Используя ваши данные в file, вы получите:

$ awk -v skip=0 '$1=="TER"{skip=skip?1:0; if (!skip)exit}1' file
ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H
0 голосов
/ 06 марта 2020

Это можно сделать так

sed '/TER/,$d' ${myArray[j]}.txt > tmp.txt #note only one " > "
mv tmp.txt ${myArray[j]}.txt
0 голосов
/ 07 марта 2020
sed '/TER/,/TER/d' 
   echo 
   "ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
    ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H  
    TER
    ATOM      1 HO5'   A     1       3.429  -7.861   3.641  1.00  0.00           H  
    ATOM      2  O5'   A     1       4.232  -7.360   3.480  1.00  0.00           O  
    ATOM      3  C5'   A     1       5.480  -8.064   3.350  1.00  0.00           C  
    ATOM      4  H5'   A     1       5.429  -8.766   2.518  1.00  0.00           H  
    TER"  |sed '/TER/,/TER/d' 


######################################################################################

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O  
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H 

sed '/Start Pattern/,/End Pattern/d'
0 голосов
/ 06 марта 2020

Вы можете просто использовать sed вот так:

sed -i.bak '/^TER/,/^TER/d' "${myArray[j]}.txt"
cat "${myArray[j]}.txt"

ATOM    186  O3'   U     6       7.297   6.145  -5.250  1.00  0.00           O
ATOM    187 HO3'   U     6       7.342   5.410  -5.865  1.00  0.00           H
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...