Используйте команду awk, чтобы получить информацию под шаблоном - PullRequest
1 голос
/ 22 января 2020

У меня есть файл с широким спектром информации, и я хочу извлечь некоторые данные отсюда. Я только опубликую здесь интересную часть. Я хочу извлечь значения IQ и JQ, а также значение J_ij [meV], которое двумя строками выше. Я прочитал этот вопрос Как напечатать 5 последовательных строк после шаблона в файле, используя awk , где шаблон используется для извлечения информации ниже, и я думал сделать что-то подобное. Моя первоначальная идея была:

awk '/IQ =/ { print $6,$12 }  /IQ =/ {for(i=2; i<=2; i++){ getline; print $11 }}' input.text > output.txt

L oop, кажется, не работает

IT   IQ   JT    JQ   N1 N2 N3    DRX    DRY    DRZ     DR         J_ij [mRy]     J_ij [meV]

 IT =  1 IQ =  **1**                     JT =  1 JQ =  **1**

->Q = ( -0.250,  0.722,  0.203)   ->Q = ( -0.250,  0.722,  0.203)

1    1    1    1    0  0  0   0.000  0.000  0.000   0.000      0.000000000     **0.000000000**

 IT =  1 IQ =  **1**                     JT =  6 JQ =  **6**

 ->Q = ( -0.250,  0.722,  0.203)   ->Q = (  0.000,  1.443,  0.609)

  1    1    6    6   -1  0 -1  -0.250 -0.144 -0.406   0.498      0.135692822     **1.846194885**

 IT =  1 IQ =  **1**                     JT =  8 JQ =  **8**

  ->Q = ( -0.250,  0.722,  0.203)   ->Q = (  0.000,  0.577,  0.609)

  1    1    8    8    0  0 -1   0.250 -0.144 -0.406   0.498      0.017676555     **0.240501782**

Мой ожидаемый результат:

IQ JQ J_ij [meV]
1 1 0.000000000
1 6 1.846194885
1 8 0.240501782

Он выделен жирным шрифтом слова (** **), первая строка только индикативная.

1 Ответ

1 голос
/ 22 января 2020

Не могли бы вы попробовать следующее. Написано и проверено на показанных примерах.

awk '
BEGIN{
  print "IQ JQ J_ij [meV]"
}
FNR>1 && /IQ =/{
  value=$6 OFS $12
  found=1
  next
}
found && NF && !/ ->Q/{
  if(value){
     print value OFS $NF
  }
  value=found=""
}'  Input_file

Вывод будет следующим.

IQ JQ J_ij [meV]
1 1 0.000000000
1 6 1.846194885
1 8 0.240501782
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...