Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#1 Le 03/05/2006, à 21:54

butnuu74

[réglé] bash script

hello

j'aimerais reproduire ce genre de truc dans un bash script :
soit x lignes d'éléments obéissants à cette règle :

famille1 élément1 élément2 élement3
famille2 élément1 élément2
famille3 élément1 élément2 élement3  élement4
famille4 élément1 élément2 élement3  élement4  élement5  élement6
famille5 élément1
[...]
famillex
(les éléments peuvent être séparés d'un espace ou d'une virgule)

J'aimerais que le bash m'affiche sur une première ligne le nom de la famille, et sur une seconde ligne que soient affichés les éléments la constituant (pour subir un autre traitement que je vais pas détailler pour ne pas compliquer tongue)
Exemple avec des données bidons :

fruits, pomme, poire, ananas, cerises
pâtes, spaguettis, penne, tortelini
couvre-chefs, chapeau, casquette, bonnet, bonnet de bain...
etc...

merci de toute aide et désolé d'avoir dû modéliser ma question pour bien me faire comprendre roll

Dernière modification par urss (Le 06/05/2006, à 00:32)

#2 Le 03/05/2006, à 22:58

sksbir

Re : [réglé] bash script

Ta phrase sur ce que t'aimerais n'est pas très claire : affiché dans une seconde quoi ?

- la valeur "famille" est-elle une clé unique ?
- le séparateur de champs, c'est toujours un espace ?


voici un début (hypothese de travail : réponse = oui aux 2 questions précédentes)

for FAMILLE in `cut -d' ' -f1 $FICHIERSOURCE`
do
    set `grep "^$FAMILLE" $FICHIERSOURCE`
    echo FAMILLE : $FAMILLE : $# valeurs repérées
    echo VALEUR1 : $1
    echo VALEUR2 : $2
done

Dernière modification par sksbir (Le 03/05/2006, à 23:01)

Hors ligne

#3 Le 03/05/2006, à 23:58

butnuu74

Re : [réglé] bash script

sksbir a écrit :

Ta phrase sur ce que t'aimerais n'est pas très claire : affiché dans une seconde quoi ?

oui j'ai précisé : une seconde ligne wink

sksbir a écrit :

- la valeur "famille" est-elle une clé unique ?
- le séparateur de champs, c'est toujours un espace ?

ok, va pour oui aux 2 questions

par contre je comprends pas le script, les données sont présentes en externe, dans FICHIERSOURCE, un fichier texte simple au même niveau que le bash ?

ça semble pas marcher par contre

#4 Le 04/05/2006, à 01:25

sksbir

Re : [réglé] bash script

Les données sont stockées dans FICHIERSOURCE, lequel doit etre initialisé avec le nom du fichier source.
exemple concret:

$ cat TEST1
famille1 élément1 élément2 élement3
famille2 élément1 élément2
famille3 élément1 élément2 élement3  élement4
famille4 élément1 élément2 élement3  élement4  élement5  élement6
famille5 élément1
$ cat test_famille.sh
FICHIERSOURCE=TEST1
for FAMILLE in `cut -d' ' -f1 $FICHIERSOURCE`
do
    set `grep "^$FAMILLE" $FICHIERSOURCE`
    echo FAMILLE : $FAMILLE : $# valeurs repérées
    echo VALEUR1 : $2
    echo VALEUR2 : $3
done
$ sh test_famille.sh
FAMILLE : famille1 : 4 valeurs repérées
VALEUR1 : élément1
VALEUR2 : élément2
FAMILLE : famille2 : 3 valeurs repérées
VALEUR1 : élément1
VALEUR2 : élément2
FAMILLE : famille3 : 5 valeurs repérées
VALEUR1 : élément1
VALEUR2 : élément2
FAMILLE : famille4 : 7 valeurs repérées
VALEUR1 : élément1
VALEUR2 : élément2
FAMILLE : famille5 : 2 valeurs repérées
VALEUR1 : élément1
VALEUR2 :
$

J'ai modifié $1 $2 par $2 $3 sinon, le script est inchangé.

sinon, puisqu'il s'agit finalement juste de remettre en forme le fichier, voici un autre exemple:

$ cat test2_famille.sh

FICHIERSOURCE=TEST1

awk '
{ print $1
 LSTVALEURS=""
 for (I=2;I<=NF;I++) { LSTVALEURS=(LSTVALEURS "--" $I) }
 print LSTVALEURS
}
' $FICHIERSOURCE
$ sh test2_famille.sh
famille1
--élément1--élément2--élement3
famille2
--élément1--élément2
famille3
--élément1--élément2--élement3--élement4
famille4
--élément1--élément2--élement3--élement4--élement5--élement6
famille5
--élément1
$

Dernière modification par sksbir (Le 04/05/2006, à 01:41)

Hors ligne

#5 Le 04/05/2006, à 09:08

cep_

Re : [réglé] bash script

L'utilisation de dialog est une autre possibilité à exploiter en complément.

#6 Le 06/05/2006, à 00:31

butnuu74

Re : [réglé] bash script

super, merci à vous deux

@sksbir : le second script est parfait, je vais garder l'idée
pour le premier par contre tu as juste oublié de faire un echo avec un for :
FAMILLE : famille1 : 4 valeurs repérées
VALEUR1 : élément1
VALEUR2 : élément2
...
VALEUR4 : élément4

merci, bonne soirée

Dernière modification par urss (Le 06/05/2006, à 00:32)

Haut de page ↑