Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk或sed打印两种图案之间的线条_Bash_Shell_Awk_Sed - Fatal编程技术网

Bash 使用awk或sed打印两种图案之间的线条

Bash 使用awk或sed打印两种图案之间的线条,bash,shell,awk,sed,Bash,Shell,Awk,Sed,我想首先通过grep解析文件的输出,查找两个模式的行以唯一字符串(即ATOM,!)开始,然后在此grep行中查找另一个模式(PVAL,PLMS)并打印。比如说 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 NI

我想首先通过grep解析文件的输出,查找两个模式的行以唯一字符串(即ATOM,!)开始,然后在此grep行中查找另一个模式(PVAL,PLMS)并打印。比如说

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
!
预期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

任何建议都将不胜感激

awk解决方案:

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

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

如果您的实际输入文件与您发布的内容相同,即使在下面也可以给出所需的输出

# 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
输入:

$ 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
!
产出-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 
产出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 

@用户31735请看一看谢谢,现在我做了我应该做的。