awk - 如果字符不在线,则 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
希望这对某人有帮助!