【问题标题】:How to select only the last match using sed?如何使用 sed 只选择最后一个匹配项?
【发布时间】:2019-11-21 16:13:10
【问题描述】:

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

 *********** 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 等中

【问题讨论】:

  • 嗯,文件超级复杂。这不是一个简单的数据表。所以我不太确定是否一定是这样。我将添加更多文件以提供更好的上下文。

标签: bash sed grep find match


【解决方案1】:

你需要使用 sed 吗?

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

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

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

(这里有点作弊,做了一些简化的假设并使用第二个 sed 只得到第一列。)

【讨论】:

  • 这很简单的 awk。如果该行的第 1 列和第 2 列分别与 *x 匹配,则为变量 v 分配第 3 列中的值。输入用完后,打印v的值。
  • 如果我想要倒数第二场而不是最后一场比赛,我怎么能做到这一点?
  • 既然问题已经发生了如此巨大的变化,我会推荐一种完全不同的方法。一般来说,要获得倒数第二个样本,快速破解类似于awk '...{a=b; b=$0} END {print a}'
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    Williams 帖子的变体。
    不要打印最新找到的,而是打印位置为3的编号

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

    【讨论】:

    • 问题是这不会打印最后一个匹配。它打印来自所有张量的所有匹配项。正如我在问题中解释的那样,这些张量中有几个,所以“* x”有几个匹配
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多