Как выбрать только последний матч, используя sed? - PullRequest
1 голос
/ 12 июля 2019

Я хочу извлечь диагональные числа этого тензора:

 *********** 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 и т. Д.

Ответы [ 3 ]

2 голосов
/ 12 июля 2019

Вам нужно использовать sed?

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

Если вам нужно использовать sed, вероятно, проще просто передать его во второй экземпляр, который печатает только последнюю строку:

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

(Здесь немного обманывают, делают некоторые упрощающие предположения и используют второе значение sed, чтобы получить только первый столбец.)

1 голос
/ 12 июля 2019

Это может сработать для вас (GNU sed):

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

Сохраните значение x в области удержания и перейдите в область удержания в конце файла.

0 голосов
/ 12 июля 2019

Вариант поста Уильямса.
Вместо того, чтобы печатать последний найденный, напечатайте тот, номер которого находится в позиции 3

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