Извлечение определенных значений из файла с помощью сценария оболочки - PullRequest
0 голосов
/ 30 мая 2019

Как извлечь значения из файла, используя shell-скрипт (например, grep, awk или sed).У меня есть следующая структура (описанная ниже), и я хочу получить выходной файл только со вторым столбцом файла.Я попытался с помощью grep: grep -oP '\s*U238\s*\*\s+[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?' file >U238_out извлечь все значения U238 из всего файла и сохранить его в выходном файле (U238_out). При этом я получаю следующий вывод:

 U238     *  1.779265E+03
 U238     *  5.418484E-03
 U238     *  1.777156E+03
         ...

, но я хочу получитьэта структура:

1.779265E+03
5.418484E-03
1.777156E+03

Структура файла:

  PERIODICITY : 0
  SYMMETRY    : 0


  MATERIAL MFUEL   
  MEDIUM   MFUEL    VOLUME  8.308106E+05


  *******************************************************
  * ISOTOPE  *   MASS (KG)   *   CIP    *    EQFMASS    *
  *******************************************************
  * U238     *  1.779265E+03 *   28.125 *  0.000000E+00 *

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

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

awk '$2=="U238" {print $4}' file > U238_out

или

awk '$2~/^U238$/ {print $4} file > U238_out

Если U238 во 2-м поле, вывести 4-е поле:

1.779265E+03
0 голосов
/ 30 мая 2019

Вы имеете в виду что-то вроде этого?

sed '/\s*\*/!d;s/\s*[*][^*]*[*]\s*\([-+.E0-9]*\).*/\1/;/^$/d' file.txt

Объяснение

/\s*\*/!d          # delete line not started with [blank]*
;                  # separator for next sed command
s/                 # substitute
\s*                # ignore leading blanks
[*]                # search first *
[^*]*[*]           # ignore everything until the next *
\s*                # ignore blanks
\([-+.E0-9]*\)     # save number into arg1 (\1)
.*                 # ignore rest of line
/\1/               # print only arg1
;                  # separator for next sed command
/^$/d              # ignore empty lines (first 3)

выход

3.099319E+02
1.274088E+01
1.779265E+03
3.789596E+02
1.760032E+02
5.049642E+01
5.002164E+01
4.777184E+00
2.594883E-19
2.594883E-19
...