поиск минимума и максимума между двумя строками в файле данных с использованием linux - PullRequest
1 голос
/ 17 февраля 2012
*KEYWORD
$TIME_VALUE = 1.4000002e+001
$STATE_NO = 15
$Output for State 15 at time = 14
*ELEMENT_SHELL_THICKNESS
1346995      25 1457683 1471891 1457727 1471929
9.953265e-001   9.953265e-001   9.953265e-001   9.953265e-001
1346996      25 1471891 1457685 1471930 1457727  
9.953963e-001   9.953963e-001   9.953963e-001   9.953963e-001
1346997      25 1457685 1471892 1471931 1471930
9.953437e-001   9.953437e-001   9.953437e-001   9.953437e-001
*End

, поэтому выходные данные могут быть

min=9.953265e-001  on line  07   at  1346995
max=9.953963e-001  on line  09   at  1346996

Возможное решение, если мы знаем, что номера строк

cat your_file | awk '
NR >= 6 && NR <= 11{at=$1;getline
if (max < $1){max=$1;max_line=NR;max_at=at}
if (min > $1){min=$1;min_line=NR;min_at=at}}
NR == 7{min=$1;min_line=NR;min_at=at}
END{
printf "min=%-13e on line  %02d at %8d\n", min, min_line, min_at
printf "max=%-13e on line  %02d at %8d\n", max, max_line, max_at}'

, но что если я хочу выполнить поиск между * Keyword и* Конец, потому что из-за небольшого редактирования в файле строка доходит до определенных строк и ее значения равны 0, поэтому минимальное значение устанавливается равным нулю.

Любое предложение.

Я должен упомянуть, что это хорошее решение было предоставлено jfgagne в моем предыдущем вопросе: min и max в определенных строках входного файла стег номера строки .

1 Ответ

2 голосов
/ 17 февраля 2012

Добавить состояние в ваш скрипт.Если ваша переменная состояния имеет значение false;установите его в true, если вы смотрите на маркер начала;в любом случае перейдите к следующей строке.Если ваша переменная состояния имеет значение true;если вы смотрите на маркер конца, установите для переменной состояния значение false и перейдите к следующей строке;в противном случае вы находитесь в регионе;обработайте строку как раньше.

awk '!there{if($1 == "*ELEMENT_SHELL_THICKNESS") there=1; next}
there&&/^\*End$/{there=0;next}
{at=$1;getline
  if (!max || max < $1){max=$1;max_line=NR;max_at=at}
  if (!min || min > $1){min=$1;min_line=NR;min_at=at}}
END{
  printf "min=%-13e on line  %02d at %8d\n", min, min_line, min_at
  printf "max=%-13e on line  %02d at %8d\n", max, max_line, max_at}' your_file

Я предполагаю, что стартовый маркер равен *ELEMENT_SHELL_THICKNESS, как указано в коде, а не *KEYWORD, как вы сказали в вопросе.Я удалил код инициализации min и max, в основном из-за лени;если любой из них может быть нулем, возможно, вам следует положить его обратно.

Это также устраняет Бесполезное использование кошки.http://porkmail.org/era/unix/award.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...