Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications
Applications Questions sur l'utilisation d'applications, du shell, et des interfaces graphiques (KDE, Gnome, XFCE... )
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/01/2008, 16h05   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 3
Points : 0
Points : 0
Par défaut [Shell] Regrouper les lignes par groupe de trois

Bonjour à tous.

Voila mon problème, étant nouveau dans la programmation en shell, je ne m'en sort pas. J'ai déja fait quelques scripts (qui marchent bien entendu) mais j'arrive à bout

Je part d'un fichier de la forme :

Citation:
oisdfjk
ouvbzehf
0001
odfsfdg
odfgisd
0001
Et j'aimerai qu'il devienne du style :

Citation:
oisdfjk,ouvbzehf,0001
odfsfdg,odfgisd,0001
J'ai essayé plusieurs solutions comme
- tr qui remplace les \n par des ,
- un for avec un awk afin de modifier, suivant le no de champs, la chose qui les séparent.

Merci d'avance.

Bazouil
bazouil29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 18h27   #2
Membre habitué
 
Inscription : mai 2004
Messages : 114
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 114
Points : 116
Points : 116
Envoyer un message via MSN à Coyote2001
Il te suffit d'utiliser la commande sed de la manière suivante :
Code :
sed 's/\[a`\-zA\-Z]*\n$/,/'
Enfin, c'est l'idée car je ne suis ni un pro des expressions régulières ni de sed.

Un pro pour confirmer la syntaxe svp ?!
Coyote2001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 11h41   #3
Invité de passage
 
Inscription : janvier 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 3
Points : 0
Points : 0
Merci pour ta réponse mais ça ne marche pas.
Je vais donc approfondir la commande SED car il semble que ça soit la meilleur solution pour palier à mon problème.
Je vous tiens au courant.

Bazouil
bazouil29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 12h57   #4
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
la syntaxe sed est peut etre erronné mais le principe est de
faire un remplacement de chaque caractere alphabetique+fin de ligne par luimême+",".

peut etre sans les \ selon les shells

ayé j'ai retrouver comment faire un join....
Code :
sed -e :a -e '/[a-zA-Z]$/N; s/\n/, /; ta' FICHIER
ou /CHAINEàCHERCHER$/N; est ce qu'on cherche
autrement n'importe quel caractere a à Z en n'importequel nombre suivit de fin de ligne (pas de ponctuation ou de chiffres comme ça tes lignes chiffrées sont automatiquement mise en fin de ligne.
à remplacer par un \n/, comme séparateur

un exemple valant mieux qu'un long discours.....
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
strx : /tmp>cat > FP
oisdfjk
ouvbzehf
[..]
ouvbzehf
0001
^D
strx : /tmp>sed -e :a -e '/[a-zA-Z]$/N; s/\n/, /; ta' FP
oisdfjk, ouvbzehf, 0001
odfsfdg, odfgisd, 0001
oisdfjk, ouvbzehf, 0001
odfsfdg, odfgisd, 0001
oisdfjk, ouvbzehf, 0001
odfsfdg, odfgisd, 0001
strx : /tmp>rm FP
strx : /tmp>
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 17h16   #5
Invité de passage
 
Inscription : janvier 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 3
Points : 0
Points : 0
Bonjour et merci frp31

J'ai essayé ta solution mais dans mon cas, j'ai oublié de préciser que les noms avec des lettres pouvaient également comprendre des chiffres.
Quelqu'un m'a donné la solution miracle.
Surtout, ne me demandez pas comment fonctionne cette fonction, je ne comprend pas tout

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
nb=0
 
while read ligne
do
    nb=$nb+1
    new="${new#,},$ligne"
    if [ $((nb%3)) -eq 0 ]
    then
        nb=0
        echo "${new#,}"
        new=""
    fi
done < fichier
J'éspere que ce code pourra servir à quelqu'un.

A bientôt.
Bazouil
bazouil29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 21h43   #6
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 546
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 546
Points : 7 779
Points : 7 779
pour chaque ligne ca la lit,
ca substitue elle meme par elle meme, la suivante tant que le compteur n'est pas a 3
sinon ca reinitialise la variable new et la variable nombre....

autrement dit ca joue sur le nombre de ligne et en utilisant que le shell...

pas mal comme methode... un code esthetique... et sympa.... je me le mets dans mes archives d'astuces....
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h54.


 
 
 
 
Partenaires

Hébergement Web