Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/05/2013, à 19:06

un_zero_2011

[Résolu] Utilisation de la commande cut

Bonjour,

Comment spécifier le dernier champ ( -f dernier-champs ) dans la commande cut ?

Si j'ai par exemple :

a  : b  : c  : d : e

Pour récupérer "e" on peut faire  cut ":" -f 5 .
Mais comme j'ai un fichier ou le nombre de champ est variable l'option -f 5 n'aura aucun sens . Que faut mettre quoi à la place du "5", pour récupérer le "e" ?.

Bien cordialement

Dernière modification par un_zero_2011 (Le 19/05/2013, à 17:26)

Hors ligne

#2 Le 18/05/2013, à 19:10

pingouinux

Re : [Résolu] Utilisation de la commande cut

Bonjour,
Avec awk
Si les champs sont séparés par des espaces

$ awk '{print $NF}' <<<"a  : b  : c  : d : e"
e

S'ils sont séparés par :

$ awk -F: '{print $NF}' <<<"a  : b  : c  : d : e"
 e

Ajouté : Avec sed

$ sed -r 's/^.*[ :]+//' <<<"a  : b  : c  : d : e"
e

Dernière modification par pingouinux (Le 18/05/2013, à 19:23)

Hors ligne

#3 Le 18/05/2013, à 19:27

un_zero_2011

Re : [Résolu] Utilisation de la commande cut

@pingouinux Merci pour la réponse rapide
Dans mon fichier txt  j'ai ces deux lignes qui se répètent :

+  1433: mip =     not found yet >=              -inf        (1; 0)
+  3839: >>>>>   1.400000000e+01 >=   1.000000000e+01  28.6% (15; 0)

Je récupère la valeur qui se trouve juste en dessous de "-inf" (ie 10), et je calcule la moyenne .

Voila la partie qui se charge de récupérer ces valeurs et de calculer leur somme (le problème est que à la place de ">>>>" je peux avoir parfois un "=" , donc je ne peux pas faire un cut -d"=" -f2, par contre je sais très bien que je n'aurais qu'un seul ">"  )

ar=$(grep -A 1 ">=              -inf" output.txt | cut -d">" -f2 | cut -d"=" -f2 | cut -d"e" -f1 | awk '{c+=$1}END{print c}')

Donc je cherche un moyen de faire un cut -d "=" -f last , pour prendre le dernier champ à chaque fois... sauf que je ne sais pas quoi mettre à la place de "last"

Dernière modification par un_zero_2011 (Le 18/05/2013, à 19:39)

Hors ligne

#4 Le 18/05/2013, à 19:43

pingouinux

Re : [Résolu] Utilisation de la commande cut

grep -v -- '-inf' output.txt | sed -r 's/^.*>= *([0-9.e+-]+) *.*$/\1/' | awk '{c+=$1}END{print c}'

Hors ligne

#5 Le 18/05/2013, à 19:51

un_zero_2011

Re : [Résolu] Utilisation de la commande cut

@pingouinux

Merci pour la réponse .
Excuses de de te déranger encore une fois ... est ce que tu peux m'expliquer ce que tu as fais ici :

 grep -v -- '-inf' output.txt | sed -r 's/^.*>= *([0-9.e+-]+) *.*$/\1/'

Je ne comprends pas grand chose tongue

Merci d'avance pour la réponse

Bien à toi

Dernière modification par un_zero_2011 (Le 18/05/2013, à 20:06)

Hors ligne

#6 Le 18/05/2013, à 20:24

pingouinux

Re : [Résolu] Utilisation de la commande cut

 grep -v -- '-inf' output.txt

Le grep élimine les lignes contenant -inf, mais le tien marche bien aussi.

sed -r 's/^.*>= *([0-9.e+-]+) *.*$/\1/'

^.*>= *
Début de ligne, suivi de zéro ou plus caractères quelconques, suivis de >=, suivis de zéro ou plus espaces.

([0-9.e+-]+)
Au moins un caractère de la liste (ceux qu'on trouve dans un nombre en écriture scientifique). Les ( ) servent à garder la chaîne trouvée en mémoire.

*.*$
Zéro ou plus espaces, suivis de zéro ou plus caractères quelconques, suivis d'une fin de ligne.

\1
Représente la chaîne mise en mémoire (le nombre flottant), par laquelle on remplace toute la ligne.

Remarque :
Ceci est plus simple et devrait marcher aussi (on élimine le grep)

sed -rn 's/^.*>= *([0-9.e+-]+) *.*$/\1/p' output.txt | awk '{c+=$1}END{print c}'

Hors ligne

#7 Le 18/05/2013, à 22:49

un_zero_2011

Re : [Résolu] Utilisation de la commande cut

@pingouinux
Merci d'avoir mis que quelques explications . J'ai essayé ta version , mais bizarrement j'obtiens un résultat qui est faux.
Pour expliquer mon problème je suis amené a te montrer mon scripte et mon fichier .txt :

Je publie ici le fichier "output.txt"  ici : http://ubuntuone.com/2aIWdEi7WccPGs1imcVdqS

Et voila mon scripte qui calcule la moyenne :

echo " "
echo "================================="
echo "Number of sources"
nb=$(grep "sources" output.txt | cut -d":" -f2)
echo $nb
echo "================================="
echo "Average of the fathomed nodes"
var=$(grep "empty" output.txt| cut -d";" -f2 | cut -d")" -f1 | awk '{a+=$1}END{print a}')
div=$(echo "$var/$nb"  | bc -l)
echo $div
echo "================================="
echo "Average of the MIP Iterations"
var=$(grep "empty" output.txt | cut -d":" -f1 | cut -d"+" -f2 | awk '{b+=$1}END{print b}')
div=$(echo "$var/$nb"  | bc -l)
echo $div
echo "================================="
echo "Average of the lower bounds"
#var=$(sed -rn 's/^.*>= *([0-9.e+-]+) *.*$/\1/p' output.txt | awk '{c+=$1}END{print c}')
var=$(grep -A 2 "begins..." output.txt | cut -d"=" -f2 | cut -d"e" -f1 | awk '{c+=$1}END{print c}')
echo $var
div=$( echo "($var*10)/$nb"  | bc -l )
echo $div
echo "================================="
echo "Objective value"
grep "Number" output.txt| cut -d":" -f2 |  awk '{d=$1}END{print d}'
echo "================================="
echo "Total elapsed time"
grep "Only" output.txt| cut -d":" -f2 | cut -d"s" -f1| awk '{e=$1}END{print e}'
echo "================================="
echo " "

Le problème se situe dans Average of the lower bounds :
La partie calcule la moyenne des valeurs qui se trouvent juste en dessous de "-inf"
Par exemple pour la source 0 :
.....
Integer optimization begins...
+  1921: mip =     not found yet >=              -inf        (1; 0)
+  5043: >>>>>   1.400000000e+01 >=   1.000000000e+01  28.6% (12; 0)
....

Je récupère la valeur 10 .

Cette moyenne est fausse ... je devrais avoir une moyenne aux alentours de 10

Bien cordialement

Dernière modification par un_zero_2011 (Le 18/05/2013, à 22:53)

Hors ligne

#8 Le 19/05/2013, à 04:45

pingouinux

Re : [Résolu] Utilisation de la commande cut

J'ai l'impression que tu supposes que l'exposant vaut toujours 1, et tu ne sembles pas le lire.
Si tu ne t'intéresses qu'à la première ligne qui suit celle contenant -inf, ceci devrait marcher (avec ton fichier, moyenne calculée=9.54)

echo "================================="
echo "Average of the lower bounds"
var=$(grep -A 1 -- "-inf" output.txt | grep -v -- '-inf'|sed -rn 's/^.*>= *([0-9.e+-]+) *.*$/\1/p'| awk '{c+=$1}END{print c}')
echo $var
div=$(  bc -l <<<"$var/$nb" )
echo $div
echo "================================="

Hors ligne

#9 Le 19/05/2013, à 10:47

un_zero_2011

Re : [Résolu] Utilisation de la commande cut

@pingouinux
Je te remercie beaucoup smile smile smile smile

Dernière modification par un_zero_2011 (Le 19/05/2013, à 11:38)

Hors ligne

#10 Le 19/05/2013, à 12:51

pingouinux

Re : [Résolu] Utilisation de la commande cut

Tu peux même simplifier ainsi :

echo "================================="
echo "Average of the lower bounds"
awk '/ -inf /{getline;$0=gensub(/^.*>= *([0-9.e+-]+) *.*$/,"\\1","");n++;c+=$0}END{print c"\n"c/n}' output.txt
echo "================================="

Hors ligne

#11 Le 19/05/2013, à 17:26

un_zero_2011

Re : [Résolu] Utilisation de la commande cut

@pingouinux
Encore merci ! smile

PS:
Est ce que tu peux m'envoyer des bons tutoriels qui pourraient m'aider à comprendre ce que tu as écris ?, ça m'aiderais à avancer plus vite.

Bien cordialement

Dernière modification par un_zero_2011 (Le 19/05/2013, à 18:35)

Hors ligne