1

У меня есть файл, содержащий тонны информации. Это выглядит так:

===============================================================================


   NSTEP       ENERGY          RMS            GMAX         NAME    NUMBER
     52      -4.8969E+05     5.1393E+00     1.7327E+03     P1         31

 BOND    =    29534.6906  ANGLE   =     2139.5547  DIHED      =     9235.7381
 VDWAALS =    51148.8783  EEL     =  -595288.4773  HBOND      =        0.0000
 1-4 VDW =     2741.3848  1-4 EEL =    26043.4789  RESTRAINT  =       29.3591
 DFTBESCF=   -15274.2075
 EAMBER  =  -489718.9594
 NMR restraints: Bond =    0.000   Angle =     0.000   Torsion =     0.000
===============================================================================

Теперь я хочу извлечь (и поместить только в один столбец) значение (здесь показано как -4.8969E+05) из столбца «Энергия» (или второго) в строке непосредственно под словом « ENERGY .

Я пытался извлечь его с помощью grep но не смог.

1 ответ1

0

Похоже, вы говорите: «Мне нужно второе поле в строке сразу после строки, содержащей слово ENERGY (в которой ENERGY - второе поле)».  Если это то, что вы хотите, вы можете сделать это с

awk '/ENERGY/ { found_it=1; next;     }
    found_it  { print $2; found_it=0; }'

(Поставьте свое имя файла в конце этой команды - сразу после }' - или передайте свои данные в вышеупомянутую команду.)

Это просто

  • Ищет строку, которая содержит строку ENERGY ,
    • устанавливает флаг (found_it), когда это делает,
    • и пропускает эту строку.
  • Когда он встречает строку и установлен флаг found_it , это означает, что предыдущая строка содержала ENERGY , поэтому
    • выведите второе слово из этой строки и
    • Очистите (обнулите) флаг found_it , чтобы мы не производили вывод из любых последующих строк.

Если в вашем файле есть строка ENERGY в строках 4, 14 и 24, то приведенная выше команда выведет второе поле из строк 5, 15 и 25.  Если это не то, что вы хотите, более простой подход

awk '/ENERGY/ { found_it=1; next; }
    found_it  { print $2;   exit; }'

который совпадает с первым, за исключением того, что после печати второго поля из строки 5 он просто перестает смотреть.  Даже если ENERGY появляется только один раз в файле, этот подход предпочтителен, поскольку он не требует чтения всего файла, а только до желаемого значения.

Эти команды будут:

  • найдите строку ENERGY даже если она является частью более крупного слова, такого как CENERGY , ENERGY-CONSUMING , ENERGYLEVEL или HIGH-ENERGY .
  • найдите строку ENERGY даже если это не второе поле в ее строке.
  • выведите значение второго поля, а не поля, в котором было найдено ENERGY .
  • не найти Energy или energy .
  • молча провалиться, если ENERGY находится на последней строке.

Если это проблемы, отредактируйте свой вопрос, чтобы указать свои требования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .