首页 > 解决方案 > 如果字符不在线,则 awk 匹配模式

问题描述

我试图找到一种方法来匹配文件中的模式,只有在模式的行上不存在某个字符时。如果存在,则应忽略带有模式的行。

两种类型的线是这样的:

.
.
.
     total energy              =   -7693.64180923 Ry
     Harris-Foulkes estimate   =   -7693.64180923 Ry
     estimated scf accuracy    <       0.00000016 Ry
.
.
.
.
!    total energy              =   -7693.64023456 Ry
     Harris-Foulkes estimate   =   -7693.64023461 Ry
     estimated scf accuracy    <       0.00000010 Ry
.
.
.
     total energy              =   -7693.64180921 Ry
     Harris-Foulkes estimate   =   -7693.64180923 Ry
     estimated scf accuracy    <       0.00000016 Ry
.
.
.
!    total energy              =   -7693.64023459 Ry
     Harris-Foulkes estimate   =   -7693.64023461 Ry
     estimated scf accuracy    <       0.00000010 Ry

有没有办法做到这一点?如果我匹配模式,那么所有带有模式的行都会出现。如果我匹配!字符然后我提取我不想出现的行。

谢谢

编辑:为了更清楚。我拥有的文件有很多数据。有些行包含pattern. 如果我做

awk '/total energy/' file.dat

我得到:

     total energy              =   -7693.64180923 Ry
!    total energy              =   -7693.64023456 Ry
     total energy              =   -7693.64180921 Ry
!    total energy              =   -7693.64023459 Ry

等等如您所见,我得到了所有包含的行,total energy其中有些行也包含!开头的字符。

我的目标是只选择包含total energy但不包含!字符的行。所以我想象的命令是这样的,但显然不是正确的语法:

awk '/if line contains has "total energy" and "!" then keep going else print line that has "total energy" and not "!"/' file.dat

file.dat 不只包含带有total energy和 的行total energy!。那里有更多数据,因此打印所有不包含!行的行下面的答案将为我提供整个文件,而不包含包含!.

我希望这更清楚。

最终编辑:

使用@Ed's answer我能够解决我的问题。我是在选择以 开头的行上的数字数据total energy但从以 . 开头的行中排除数据之后!total energy最终目标是还从模式下方的两行(以 开头的行)中提取数据estimated scf accuracy。我在@Ed 评论之后提出的命令是这样的:

awk '/     total energy/ && !/!/{a=$4; nr[NR+2]}; NR in nr{print a,"   ",$5}' file.dat

希望这对某人有帮助!

标签: awk

解决方案


听起来您可能想要:

awk '/pattern/ && !/!/' file

但是请参阅我在您的问题下的评论,因为目前尚不清楚您到底要做什么


推荐阅读