#1 Le 19/01/2014, à 17:48
- Compte supprimé
[Résolu] Bash, retour sur une ligne, problème d'espace
Bonjour
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 !
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 22/01/2014, à 12:51)
#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
- Compte supprimé
Re : [Résolu] Bash, retour sur une ligne, problème d'espace
Salut Watael
Merci pour ta solution qui en plus fonctionne !!!
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.
#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
- Compte supprimé
Re : [Résolu] Bash, retour sur une ligne, problème d'espace
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 !
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 !
A+ Slyfox
Dernière modification par Compte supprimé (Le 19/01/2014, à 23:38)
#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
- Compte supprimé
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 !
NB : Pendant que tu as édité ton poste #6 j'ai fait de même avec le #5...
Amicalement Slyfox
Dernière modification par Compte supprimé (Le 19/01/2014, à 23:21)
#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
- Compte supprimé
Re : [Résolu] Bash, retour sur une ligne, problème d'espace
Et nous avons un gagnant !
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 Compte supprimé (Le 20/01/2014, à 06:27)
#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
- Compte supprimé
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 Compte supprimé (Le 22/01/2014, à 17:32)