使用 awk 仅获取正则表达式的第一个实例

使用 awk 仅获取正则表达式的第一个实例

.txt我的目录中有一堆文件,其中包含有关偶极矩的信息。它是这样的:

Dipole Moment: [D]
     X:     1.2808      Y:     0.2908      Z:     1.0187     Total:     1.6622
lorem ipsum
text 
that is 
not 
relevant 
Dipole Moment: [D]
     X:     1.2808      Y:     0.2908      Z:     1.0187     Total:     1.6622
more text

我想从这些文件中提取总偶极矩。我正在运行以下脚本:

awk '/Dipole Moment: \[D\]/{found=1;next} found{print $NF;found=""}' *.txt > dipole_bma.txt

该脚本打印 1.6622 两次。每个文件中每隔一个Total偶极矩两次。我看到它打印了两次,因为正则表达式在文件中出现了两次。

我的问题是,如何从每个文件中仅打印一次总偶极矩?

答案1

使用nextfile陈述:

awk '/Dipole Moment: \[D\]/{found=1;next} found{print $NF;nextfile;}' *.txt

答案2

Gnu sed 可以执行以下操作:

sed -ns '
  /^Dipole Moment: \[D]/!d
  $!N;/\n/s/.* //p;:n;n;bn
' ./*.txt
  • -s选项(nonPosix)将文件视为单独的流。
  • -n将在获取下一条记录之前禁止模式空间的默认打印。
  • 在偶极矩线之后,我们将下一条线粘贴到图案空间。
  • 删除直到最后一个空格(假设没有尾随空格),这会打印最后一个字段,即偶极矩的值。
  • 然后我们滑到当前文件的末尾。对于下一个文件重复整个过程。

相关内容