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 19/01/2014, à 17:48

Slyfox

[Résolu] Bash, retour sur une ligne, problème d'espace

Bonjour smile

Voilà un script :

#! /bin/bash

info="Numero: 01 Nom: Jean Age: 22 Langue: English
Numero: 01 Nom: Jean Age: 22 Langue: Anglais
Numero: 02 Nom: Claude Age: 26 Langue: Francais
Numero: 03 Nom: Pierre Age: 53 Langue: Francais"

boucle=$(for i in 01 02 03; do
    	         num=$(echo "$info" | awk '{if ($2=='$i') {print $2}}' | sort -u)
    	         nom=$(echo "$info" | awk '{if ($2=='$i') {print $4}}' | sort -u)
               echo "TRUE Numero: "$num" Nom: "$nom"|"
        done)

echo
echo "$boucle" 
echo
echo "$boucle" | xargs -n 100
echo
echo "$boucle" | sed '{:a;$!N;s_\n_ _;ta}'

Voilà ce que ça me retourne...

Avec echo "$boucle"

TRUE Numero: 01 Nom: Jean|
TRUE Numero: 02 Nom: Claude|
TRUE Numero: 03 Nom: Pierre|

Avec echo "$boucle" | xargs -n 100

TRUE Numero: 01 Nom: Jean| TRUE Numero: 02 Nom: Claude| TRUE Numero: 03 Nom: Pierre|

Avec echo "$boucle" | sed '{:a;$!N;s_\n_ _;ta}'

TRUE Numero: 01 Nom: Jean| TRUE Numero: 02 Nom: Claude| TRUE Numero: 03 Nom: Pierre|

J'aimerais comprendre pourquoi avec "echo "$boucle" | xargs -n 100" et "echo "$boucle" | sed '{:a;$!N;s_\n_ _;ta}'"  pourquoi j'ai un espace après le | de  "| TRUE"

NB:
Si il y a une autre solution de me retourner le résultat de "$boucle" sur une ligne je suis bien sûr preneur ! big_smile

Amicalement Slyfox

Dernière modification par Slyfox (Le 22/01/2014, à 12:51)

Hors ligne

#2 Le 19/01/2014, à 18:14

Watael

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

salut,

à cause du \n
dans le cas du sed, c'est toi qui ajoute l'espace.

avec un tableau

$ info="Numero: 01 Nom: Jean Age: 22 Langue: English
Numero: 01 Nom: Jean Age: 22 Langue: Anglais
Numero: 02 Nom: Claude Age: 26 Langue: Francais
Numero: 03 Nom: Pierre Age: 53 Langue: Francais"
$ for i in 0{1..3}
do
   num=$(echo "$info" | awk '{if ($2=='$i') {print $2}}' | sort -u) # à mon avis ceci est faux; je le laisse pour alimenter le test.
   nom=$(echo "$info" | awk '{if ($2=='$i') {print $4}}' | sort -u) # idem

   boucle+=( "TRUE Numero: $num Nom: $nom|" ) # un " au début, et un à la fin, c'est suffisant ;)

done
$ printf '%s' "${boucle[@]}" $'\n'
TRUE Numero: 01 Nom: Jean|TRUE Numero: 02 Nom: Claude|TRUE Numero: 03 Nom: Pierre|
$

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 19/01/2014, à 18:22

Slyfox

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

Salut Watael

Merci pour ta solution qui en plus fonctionne !!! smile

Sinon comment aurais-tu écrire la partie :

   num=$(echo "$info" | awk '{if ($2=='$i') {print $2}}' | sort -u) # à mon avis ceci est faux; je le laisse pour alimenter le test.

Hors ligne

#4 Le 19/01/2014, à 19:26

Watael

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

$ info="Numero: 01 Nom: Jean Age: 22 Langue: English
Numero: 01 Nom: Jean Age: 22 Langue: Anglais
Numero: 02 Nom: Claude Age: 26 Langue: Francais
Numero: 03 Nom: Pierre Age: 53 Langue: Francais"
$ sort -u -k2,2 -k4,4 <<<"$info" | awk '{printf("TRUE Numero: %s Nom: %s|",$2,$4)}'
TRUE Numero: 01 Nom: Jean|TRUE Numero: 02 Nom: Claude|TRUE Numero: 03 Nom: Pierre|$ 

mais je ne suis pas certain de tes intentions.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 19/01/2014, à 22:38

Slyfox

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

Watael a écrit :

mais je ne suis pas certain de tes intentions.

Autant pour moi j'aurai dù te le préciser... bien que ce n'est pas mon but premier dans ce topic, mais de toute façon il faudra bien que je trouve une solution, alors allons-y ! smile
voici le résultat final désiré :

boucle="TRUE|Numero: 01 Nom: Jean Langue: English Anglais|TRUE|Numero: 02 Nom: Claude Langue: Francais|TRUE|Numero: 03 Nom: Pierre Langue: Francais|"

IFS=$'|'

zenity --list --checklist --column="" --column="" $boucle

EDIT:
Super le codage de ton dernier poste !!!

Par rapport à ça j'ai 2 questions...

1. Je ne connaissais pas les "<<<", si j'ai bien compris c'est équivalant à un "cat" ???
2. Pour le "sort -u -k2,2 -k4,4" si je comprends bien cela supprime les lignes qui ont la même colonne 2 ET 4 en commun ???

Pour ta solution du poste #2 je suis encore en train de méditer dessus... c'est nouveau pour moi cette façon de coder... tant mieux quelque chose de nouveau à apprendre ! lol cool

A+ Slyfox

Dernière modification par Slyfox (Le 19/01/2014, à 23:38)

Hors ligne

#6 Le 19/01/2014, à 22:52

Watael

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

1- plutôt à un ``echo''
2- ça ne garde que la première occurrence du couple champ 2 champ 4.

d'où sort le format de ``$info"" ?
si c'est ton choix, pourquoi alors ne pas adopter le format CSV ?
il serait plus cohérent pour une base de données.
et dans ce cas, awk est l'outil à utiliser quasi-exclusivement.
voici un aperçu de ce qu'il peut faire

$ echo "$info"
Numero: 01 Nom: Jean Age: 22 Langue: English
Numero: 01 Nom: Jean Age: 22 Langue: Anglais
Numero: 02 Nom: Claude Age: 26 Langue: Francais
Numero: 03 Nom: Pierre Age: 53 Langue: Francais
$ awk '{a[$2,$4]=a[$2,$4]?a[$2,$4]" "$8:$8}END{for(i in a){split(i,A,"\034");print A[1],A[2],a[i]}}' <<<"$info"
02 Claude Francais
03 Pierre Francais
01 Jean English Anglais

on peut formater la sortie, trier le tableau en sortie...

Dernière modification par Watael (Le 19/01/2014, à 23:02)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 19/01/2014, à 23:08

Slyfox

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

De mieux en mieux !!!
Avec tout ce que tu me sors j'ai de quoi méditer pendant un mois ! lol

NB : Pendant que tu as édité ton poste #6 j'ai fait de même avec le #5...

Amicalement Slyfox

Dernière modification par Slyfox (Le 19/01/2014, à 23:21)

Hors ligne

#8 Le 20/01/2014, à 00:00

Watael

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

je ne suis pas un spécialiste de zenity, mais après quelques recherches et essais

awk '{a[$2,$4]=a[$2,$4]?a[$2,$4]" "$8:$8}END{for(i in a){split(i,A,"\034");print "TRUE\n",A[1],A[2],a[i]}}' <<<"$info" | zenity --list --checklist --separator='\n' --column="" --column=""

Dernière modification par Watael (Le 20/01/2014, à 00:01)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 20/01/2014, à 06:26

Slyfox

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

Et nous avons un gagnant ! smile

Pourrai-tu me donner un filon pour comprendre la ligne d'awk... soit une petite explication ou un lien avancé...

A+ Slyfox

Dernière modification par Slyfox (Le 20/01/2014, à 06:27)

Hors ligne

#10 Le 20/01/2014, à 13:17

Watael

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

une petite correction :

awk '{a[$2,$4]=($2"\034"$4 in a)?a[$2,$4]" "$8:$8}END{for(i in a){split(i,A,"\034");print "TRUE\n",A[1],A[2],a[i]}}' <<<"$info" \
   | zenity --list --checklist --separator='\n' --column="" --column=""

la partie ``($2"\034"$4 in a)'' permet de tester l'existence de l'élément dans le tableau sans le créer s'il n'existe pas.
cf. awk's user manual /Référence à un élément d'un tableau

la première partie du code awk assigne le champ #8, ou la concaténation de l'élément existant et du champ #8, à l'élément du tableau dont l'index est champ #2 et champ #4.

i = (condition) ? vrai : faux

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 22/01/2014, à 12:39

Slyfox

Re : [Résolu] Bash, retour sur une ligne, problème d'espace

@ Watael

Encore merci pour ton aide et ton lien sur le man d'awk.
C'est le lien qu'il me fallait pour progresser...

Amicalement Slyfox

Dernière modification par Slyfox (Le 22/01/2014, à 17:32)

Hors ligne