Извлечь значение из текстового файла в определенной позиции

331
Vito Genna

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

===============================================================================   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
Я сделал ваш вопрос несколько читабельным. Возьмите это в качестве примера и улучшайте дальше ([править]), если это необходимо. В частности: принадлежат ли эти `===` файлу? `**` принадлежат? Также обратите внимание, что мы не являемся сервисом написания сценариев, требуются некоторые исследования. что ты уже испробовал? Kamil Maciorowski 6 лет назад 0
Пожалуйста, нажмите «изменить» выше слева и добавьте к исходному сообщению то, о чем мы просили. Является ли файл, который вы пытаетесь извлечь из таблицы; символы разделяют столбцы или они разделены пробелами? Если вы можете загрузить образец файла в другое место, например, на Google Диск, и поделиться URL-адресом, чтобы мы могли его скачать, это ускорит разрешение. Пожалуйста, включите также то, что вы пробовали с помощью grep; Нам гораздо проще исправить испорченный скрипт, чем писать с нуля. K7AAY 6 лет назад 0
Если файл содержит только разделители пробелов (без табуляции, без пробелов), вы можете использовать `cut -c MN` для извлечения нужных столбцов с некоторыми дополнительными фильтрами для удаления неколоночных данных. AFH 6 лет назад 0

1 ответ на вопрос

0
G-Man

Похоже, вы говорите: «Я хочу, чтобы второе поле в строке сразу после строки, содержащей слово 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находится на последней строке.

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

Работает отлично! Я сходил с ума от awk! Большое спасибо за ваши драгоценные усилия и время! Вы сделали мой день! :) Vito Genna 6 лет назад 0

Похожие вопросы