若字符不在线上,则awk匹配模式

  • 本文关键字: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的答案,我解决了我的问题。我选择了以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
$

最新更新