trouver min et maximum entre deux chaînes dans un fichier de données en utilisant linux

StackOverflow https://stackoverflow.com/questions/9325013

  •  27-10-2019
  •  | 
  •  

Question

*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

sortie pourrait être

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

Une solution probable, si l'on connaît les numéros de ligne est

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}'

mais si je veux chercher entre les mots-clés * et * Fin, car en raison d'une petite modification dans le fichier la chaîne vient aux lignes définies et ses valeurs est 0 pour le minimum est fixé à zéro.

Toute suggestion.

Je dois mentionner que cette bonne solution a été fournie par jfgagne dans ma précédente question: min et max dans certaines lignes de fichier d'entrée avec l'étiquette de numéro de ligne .

Était-ce utile?

La solution

Ajouter un état à votre script. Si votre variable d'état est faux; mettre à true si vous regardez le marqueur de début; en tout état de cause, passez à la ligne suivante. Si votre variable d'état est vrai; si regardant marqueur de fin, définissez la variable d'état à false, et passez à la ligne suivante; sinon, vous êtes dans la région; traiter la ligne comme précédemment.

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

Je suppose que le marqueur de début est *ELEMENT_SHELL_THICKNESS comme suggéré par le code, plutôt que *KEYWORD comme vous le dites dans la question. J'ai supprimé le code d'initialisation min et max, la plupart du temps hors de la paresse; si peut être soit zéro, peut-être vous devriez le mettre avant.

élimine également l'utilisation Inutile de Cat. http://porkmail.org/era/unix/award.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top