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