简体   繁体   English

使用awk或sed在两种模式之间打印线条

[英]Print lines in between two patterns using awk or sed

I want to parse through the output from a file by first grep the lines finding two patterns starts with unique string (ie ATOM, !) and then find another patterns (PVAL, PLMS) in this grep lines and print. 我想通过首先grep解析文件的输出,找到两个模式的行以唯一的字符串(即ATOM,!)开始,然后在这个grep行中找到另一个模式(PVAL,PLMS)并打印。 For example 例如

ATOM 17 COMMENT CL01 
 PRNT 16 
 PVAL    7.243  SIGPV    0.038 
 PLMS 1  1  -0.034   PLMS 3  1  -0.050 
 PLMS 3  3  -0.063   PLMS 4  4   0.016
! 
ATOM 17 COMMENT CL02
 NIEG 2
 PVAL    7.242  SIGPV    0.008 
 PLMS 1  1  -0.046   PLMS 3  1  -0.011 
 PLMS 3  3   0.072   PLMS 4  4   0.019 
!
ATOM 9 COMMENT F01
 NEIG 4 
 EXCEPT OH 
 PVAL    7.185   SIGPV    0.031
 PLMS 1  1  -0.064   PLMS 2 -2   0.005
 PLMS 3  1  -0.011   PLMS 4  2  -0.006
 PLMS 4  4   0.006
!

Expected o/p should be 应该是预期的o / p

ATOM 17 COMMENT CL01 PVAL    7.243  SIGPV    0.038 PLMS 1  1  -0.034   PLMS 3  1  -0.050 PLMS 3  3  -0.063   PLMS 4  4   0.016

ATOM 17 COMMENT CL02  PVAL    7.242  SIGPV    0.008 PLMS 1  1  -0.046   PLMS 3  1  -0.011 PLMS 3  3   0.072   PLMS 4  4   0.019

ATOM 9 COMMENT F01 PVAL    7.185   SIGPV    0.031 PLMS 1  1  -0.064   PLMS 2 -2   0.005 PLMS 3  1  -0.011   PLMS 4  2  -0.006 PLMS 4  4   0.006

Any suggestion is much appreciated. 任何建议都非常感谢。

Even below one can give desired output, if your real input file is same as what you have posted. 如果您的真实输入文件与您发布的文件相同,即使是低于一个也可以提供所需的输出。

# either
awk  'f=/ATOM|PVAL|PLMS|!/{ORS=/^!/?RS:OFS; if(/^!/)$1=""}f' infile

# or
awk  'f=/ATOM|PVAL|PLMS/{ORS=OFS}!f && f=/!/{ORS=RS; $1=""}f' infile

Input: 输入:

$ cat infile
ATOM 17 COMMENT CL01 
 PRNT 16 
 PVAL    7.243  SIGPV    0.038 
 PLMS 1  1  -0.034   PLMS 3  1  -0.050 
 PLMS 3  3  -0.063   PLMS 4  4   0.016
! 
ATOM 17 COMMENT CL02
 NIEG 2
 PVAL    7.242  SIGPV    0.008 
 PLMS 1  1  -0.046   PLMS 3  1  -0.011 
 PLMS 3  3   0.072   PLMS 4  4   0.019 
!
ATOM 9 COMMENT F01
 NEIG 4 
 EXCEPT OH 
 PVAL    7.185   SIGPV    0.031
 PLMS 1  1  -0.064   PLMS 2 -2   0.005
 PLMS 3  1  -0.011   PLMS 4  2  -0.006
 PLMS 4  4   0.006
!

Output-1: 输出1:

$ awk  'f=/ATOM|PVAL|PLMS|!/{ORS=/^!/?RS:OFS; if(/^!/)$1=""}f' infile
ATOM 17 COMMENT CL01   PVAL    7.243  SIGPV    0.038   PLMS 1  1  -0.034   PLMS 3  1  -0.050   PLMS 3  3  -0.063   PLMS 4  4   0.016 
ATOM 17 COMMENT CL02  PVAL    7.242  SIGPV    0.008   PLMS 1  1  -0.046   PLMS 3  1  -0.011   PLMS 3  3   0.072   PLMS 4  4   0.019  
ATOM 9 COMMENT F01  PVAL    7.185   SIGPV    0.031  PLMS 1  1  -0.064   PLMS 2 -2   0.005  PLMS 3  1  -0.011   PLMS 4  2  -0.006  PLMS 4  4   0.006 

Output-2: 输出2:

$ awk  'f=/ATOM|PVAL|PLMS/{ORS=OFS}!f && f=/!/{ORS=RS; $1=""}f' infile
ATOM 17 COMMENT CL01   PVAL    7.243  SIGPV    0.038   PLMS 1  1  -0.034   PLMS 3  1  -0.050   PLMS 3  3  -0.063   PLMS 4  4   0.016  
ATOM 17 COMMENT CL02  PVAL    7.242  SIGPV    0.008   PLMS 1  1  -0.046   PLMS 3  1  -0.011   PLMS 3  3   0.072   PLMS 4  4   0.019  
ATOM 9 COMMENT F01  PVAL    7.185   SIGPV    0.031  PLMS 1  1  -0.064   PLMS 2 -2   0.005  PLMS 3  1  -0.011   PLMS 4  2  -0.006  PLMS 4  4   0.006 

awk solution: awk解决方案:

awk '/^ATOM/{ f=1; r=$0 }/^!/{ print r; f=0 }f && ($1~/^(PVAL|PLMS)/){ r=r OFS $0 }' file

The output: 输出:

ATOM 17 COMMENT CL01   PVAL    7.243  SIGPV    0.038   PLMS 1  1  -0.034   PLMS 3  1  -0.050   PLMS 3  3  -0.063   PLMS 4  4   0.016
ATOM 17 COMMENT CL02  PVAL    7.242  SIGPV    0.008   PLMS 1  1  -0.046   PLMS 3  1  -0.011   PLMS 3  3   0.072   PLMS 4  4   0.019 
ATOM 9 COMMENT F01  PVAL    7.185   SIGPV    0.031  PLMS 1  1  -0.064   PLMS 2 -2   0.005  PLMS 3  1  -0.011   PLMS 4  2  -0.006  PLMS 4  4   0.006

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM