Bash 如何使用sed仅选择最后一个匹配?
我想提取这个张量的对角数:Bash 如何使用sed仅选择最后一个匹配?,bash,sed,grep,find,match,Bash,Sed,Grep,Find,Match,我想提取这个张量的对角数: *********** Symmetrised Stress Tensor *********** * * * Cartesian components (GPa) * * --------------------------------------------- * * x y
*********** 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
然而,由于有几个这样的张量,这给了我文件1中所有可能的匹配。我只想要最后一个匹配,最后一个张量的x分量
期望输出为:
3.832865
在文件x-component.txt中
3.832865
在文件y-component.txt等中,是否需要使用sed
awk '$1 == "*" && $2 == "x" {v=$3} END {print v}' input
如果您必须使用sed,则通过管道将其传输到只打印最后一行的第二个实例可能更容易:
< input sed -n '/^\* *x */s///p' | sed -n '$s/ .*//p'
这里有点作弊,做一些简单的假设,使用第二个sed只得到第一列。这可能对你的GNU sed有用:
sed -E '/^\s*\*\s*x\s*(\S+).*/{s//\1/;h};$!d;x' file
将x值存储在保留空间中,并交换到文件末尾的保留空间。Williams post的变体。 不要打印最新找到的,而是打印第3位有数字的
这很简单。如果行的第一列和第二列分别匹配*和x,则变量v在第三列中被赋值。输入用尽后,v的值被打印出来。如果我想要倒数第二个匹配,而不是最后一个匹配,我怎么能实现呢?既然问题发生了如此巨大的变化,我建议采用完全不同的方法。一般来说,为了获得倒数第二个示例,快速破解类似于awk’…{a=b;b=$0}END{print a}'Mmm文件非常复杂。这不是一个简单的数据表。所以我不太确定是否一定是这样。我会放更多的文件以提供更好的上下文。问题是这不会打印最后一个匹配。它打印所有张量的所有匹配项。正如我在问题中所解释的,这些张量中有好几个,所以*x有几个匹配项
awk '$1=="*" && $2=="x" && $3~/[[:digit:]]/ {print $3}' file
3.832865