Как я могу использовать sed / awk / grep для печати строк между двумя одинаковыми словами в отдельном файле? - PullRequest
1 голос
/ 22 апреля 2020

Я хотел бы напечатать все строки между двумя шаблонами, каждая часть в отдельном файле.

Шаблон:

ATOM  10185  O   WAT   622      86.629 114.783 125.073  1.00  0.00.  
ATOM  10186  H1  WAT   622      87.265 114.479 125.721  1.00  0.00.  
ATOM  10187  H2  WAT   622      86.215 115.543 125.482  1.00  0.00.  
TER  
ATOM  10188  O   WAT   623      84.441 115.565 126.663  1.00  0.00.  
ATOM  10189  H1  WAT   623      85.076 115.261 127.311  1.00  0.00.  
ATOM  10190  H2  WAT   623      84.027 116.325 127.071  1.00  0.00.  
TER  
ATOM  10191  O   WAT   624      85.591 117.441 124.690  1.00  0.00.    
ATOM  10192  H1  WAT   624      86.226 117.137 125.338  1.00  0.00.   
ATOM  10193  H2  WAT   624      85.176 118.201 125.098  1.00  0.00.   
TER

Что я хочу иметь в новых файлах is:

file1:

ATOM  10185  O   WAT   622      86.629 114.783 125.073  1.00  0.00.  
ATOM  10186  H1  WAT   622      87.265 114.479 125.721  1.00  0.00.  
ATOM  10187  H2  WAT   622      86.215 115.543 125.482  1.00  0.00.  
TER   

file2:

ATOM  10188  O   WAT   623      84.441 115.565 126.663  1.00  0.00.  
ATOM  10189  H1  WAT   623      85.076 115.261 127.311  1.00  0.00.  
ATOM  10190  H2  WAT   623      84.027 116.325 127.071  1.00  0.00.  
TER  

et c.

Я перепробовал все, что нашел на сайте и inte rnet, но я не получаю то, что мне нужно, в конце концов. В основном, это как найти между двумя шаблонами, такими как patern1xxxxxpatern2, и распечатать их в файле. ( sed или awk для печати строк между словами , https://unix.stackexchange.com/questions/264962/print-lines-of-a-file-between-two-matching-patterns/264977 и аналогичными)

Я пробовал это, но я получаю ошибку awk: illegal statement at source line 1:

awk '/TER/{n+=1}{print > "file_"n".txt"}'

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 апреля 2020

wrt:

Я пробовал это, но получаю ошибку "awk: недопустимое утверждение в строке источника 1":

awk '/ TER / {n + = 1} {print> "file_" n ".txt"} '

, что, вероятно, связано с выражением без скобок в правой части перенаправления вывода, поскольку это неопределенное поведение для POSIX. Если это так, то изменение "file_"n".txt" на ("file_"n".txt") поможет вам преодолеть это и перейти к следующей проблеме. Вот как на самом деле делать то, что вы хотите с любым awk:

awk '
BEGIN { out = "file" (++c) }
{ print > out }
$0=="TER" {
    close(out)
    out = "file" (++c)
}
' file
0 голосов
/ 22 апреля 2020

Это может работать для вас (GNU csplit):

csplit -sb '%d' -zf file inputFile '/^TER/+1' '{*}'

Это создает файл с file0 по filen, каждый из которых содержит шаблон TER в качестве последней строки каждого файла.

0 голосов
/ 22 апреля 2020

man (1) awk в BSD-подобных системах дает такой ответ:

/start/, /stop/
              Print all lines between start/stop pairs.


% cat 1.txt
l-2
l-1
TER1
l1
l2
l3
l4
l5
TER2
l6
l7

Тест:

% awk '/TER1/, /TER2/' 1.txt 
TER1
l1
l2
l3
l4
l5
TER2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...