我正试图找到一种方法来匹配文件中的模式,只有在与模式的行上不存在特定字符的情况下。如果存在,则应忽略带有图案的线条。
两种类型的线路如下:
.
.
.
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的答案,我解决了我的问题。我选择了以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 '/pattern/ && !/!/' file
但请看我在你的问题下的评论,因为目前还不清楚你到底想做什么
您必须使用!
来否定模式。
awk '!/!/{if ($0 ~ "pattern") print}'
演示:
$echo -e '123!abcn123#abcn123def'
123!abc
123#abc
123def
$echo -e '123!abcn123#abcn123def' | awk '/!/{print}' # print line with !
123!abc
$echo -e '123!abcn123#abcn123def' | awk '!/!/{print}' # print line not with !
123#abc
123def
$