如何使用sed仅选择最后一个匹配项?

时间:2019-07-11 21:50:03

标签: bash sed grep find match

我想提取该张量的对角线数:

 *********** Symmetrised Stress Tensor ***********
 *                                               *
 *          Cartesian components (GPa)           *
 * --------------------------------------------- *
 *             x             y             z     *
 *                                               *
 *  x      3.832865      0.000000      0.000000  *
 *  y      0.000000      3.832865      0.000000  *
 *  z      0.000000      0.000000      3.922869  *
 *                                               *
 *  Pressure:   -3.8629                          *
 *                                               *
 *************************************************

为此,我尝试了以下方法

sed -n 's/.*\* *x *\([0-9.-]*\).*/\1/p' file1 >> x_component.txt

但是,由于这些张量中有几个,因此这给了我file1中所有可能的匹配项。而且我只想要最后一个匹配项(只希望最后一个张量的x分量)。

所需的输出是:

3.832865 

在x-component.txt文件中

3.832865

在y-component.txt文件等中

3 个答案:

答案 0 :(得分:2)

您需要使用sed吗?

awk '$1 == "*" && $2 == "x" {v=$3} END {print v}' input

如果必须使用sed,将其通过管道传输到仅打印最后一行的第二个实例可能会更容易:

< input sed -n '/^\* *x */s///p' | sed -n '$s/ .*//p'

(在这里作弊,做一些简化的假设,并使用第二个sed仅获得第一列。)

答案 1 :(得分:1)

这可能对您有用(GNU sed):

sed -E '/^\s*\*\s*x\s*(\S+).*/{s//\1/;h};$!d;x' file

x值存储在保留空间中,并交换到文件末尾的保留空间。

答案 2 :(得分:0)

Williams帖子的另一种形式。
而不是打印找到的最新内容,而是打印编号为3

的内容
awk '$1=="*" && $2=="x" && $3~/[[:digit:]]/ {print $3}' file
3.832865