Как найти только одно слово после шаблона с пробелами? - PullRequest
1 голос
/ 11 июля 2019

Я хочу получить только число между знаком равенства и эВ

Final energy =  -2959.123199674     eV

Я не могу просто получить одинаковый символ, потому что в этом файле их слишком много. Я хочу получить "Окончательную энергию =" и получить обратно -2959.123199674.

Я пытался:

awk '{for(i=1;i<=NF;i++)if($i=="Final Energy =")print $(i+1)}' filename

Но это не работает

Как я могу включить эти пробелы?

Ответы [ 3 ]

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

Вы можете использовать sed как

sed -n 's/.*Final [Ee]nergy *= *\([0-9.-]*\).*/\1/p' filename

См. онлайн sed демо :

s="Final energy =  -2959.123199674     eV"
sed -n 's/.*Final [Ee]nergy *= *\([0-9.-]*\).*/\1/p'  <<< "$s"
# => -2959.123199674

Шаблон .*Final [Ee]nergy *= *\([0-9.-]*\).* POSIX BRE будет соответствовать всей строке с Final energy (я использовал выражение в скобках для соответствия e или E), ноль или более пробелов, =, снова ноль или более пробелы, а затем будет записывать в группу 1 (\1) любые 0 или более цифр, точек или дефисов. Опции -n и p заставят sed печатать только результат замещения.

Если вы предпочитаете вводить в группу 1 любые символы, кроме пробелов, замените [0-9.-]* на [^[:space:]]*. Или даже [^ ]*.

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

Сначала grep для Final energy, затем используйте grep -o, чтобы извлечь число:

grep 'Final energy =' | grep -o '[-[:digit:].]*'
0 голосов
/ 11 июля 2019

Не могли бы вы попробовать один раз.

awk '{sub(/.*=/,"");sub(/eV.*/,"");gsub(/^ +| +$/,"")} 1' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...