trouver min et maximum entre deux chaînes dans un fichier de données en utilisant linux
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 .
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