Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
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 05/05/2011, 11h46   #1
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
Par défaut [ksh] Ajouter un retour chariot

Bonjour,

J'ai une chaine #TOTO #TITI #TUTU #TATA...
Je voudrais qu'à partir du deuxième #, il y'ait une retour à la ligne avant chacun des # suivants, ce qui donnerait
#TOTO
#TITI
#TUTU
#TATA
...

NB : le nombre de # n'est pas fixe.

J'ai déjà essayé avec un sed 's/#/\\\n/g' mais le \n n'est pas interprété j'obtiens \n#TOTO \n#TITI \n#TUTU \n#TATA

Merci d'avance
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 12h14   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 13h27   #3
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Question con: dans ton exemple, tu n'as pas d'espaces dans les textes, c'est le cas aussi dans ta vraie chaine ?

Si oui, tu peux utiliser tr:
Code :
1
2
3
4
5
$ echo "#TOTO #TITI #TUTU #TATA" | tr ' ' '\n'
#TOTO
#TITI
#TUTU
#TATA
Sinon, la solution de zipe31 est la plus simple
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 05/05/2011, 14h20   #4
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
Merci à tous les deux!
Par contre, seule la solution marche chez moi, ça vient peut être de mon ksh qui est une ancienne version... Voici le résultat que ça donne

#TOTOn#TITIn#TUTUn#TATA

Je vais donc prendre la solution de Alek-C qui me convient parfaitement
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 14h25   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par Cj_Dal Voir le message
Par contre, seule la solution avec "tr" marche chez moi, ça vient peut être de mon ksh qui est une ancienne version... Voici le résultat que ça donne

#TOTOn#TITIn#TUTUn#TATA
Quel système ?
Quelle version de ksh ?
Quelle version de sed ?

Avec ksh93 :

Code :
1
2
3
4
5
6
$ echo "#TOTO #TITI #TU TU #TA TA" | sed 's/ \(#\)/\n\1/g'
#TOTO
#TITI
#TU TU
#TA TA
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 14h34   #6
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
En fait j'ai dit une bétise la solution de Alek-C ne va pas marcher lorsque j'aurais des chaînes de caractère avec des espaces à la place des TOTO...

Sinon :
Quel système ? AIX Version 5.3
Quelle version de ksh ? je ne sais pas comment on la trouve
Quelle version de sed ? je ne sais pas comment on la trouve
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 14h45   #7
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par Cj_Dal Voir le message
Quelle version de ksh ? je ne sais pas comment on la trouve
Quelle version de sed ? je ne sais pas comment on la trouve
Essaye :

ksh -v
sed -v
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 14h50   #8
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
C'est essayé déjà mais ça marche pas
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 15h00   #9
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
Bonjour

Essais ceci:

Code :
1
2
3
4
5
6
7
8
9
 
VAR="#TOTO #TITI #TUTU #TATA"
 
OLD_IFS="$IFS"
export IFS="#"
 
for i in $VAR ; do echo "#$i" ; done
 
export IFS="$OLD_IFS"
Lilian.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 15h11   #10
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
Merci Lilian on s'en rapproche ça me donne :
#
#TOTO
#TITI
#TUTU
#TATA

Pour info, à quoi sert la variable IFS?
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 16h40   #11
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
Cj_dal,

La variable IFS représente le séparateur de champs, par défaut elle contient l'espace, le retour chariot (et le tab ?).
Tu peux la modifier pour utiliser d'autres séparateurs, en l’occurrence pour toi le #

Dans le cas de ce que je t'ai donné, la première ligne s'explique parce que la variable commence par un séparateur. Pour le résoudre il faut donc que tu élimines les lignes contenant uniquement #

Code :
1
2
3
4
5
6
7
8
9
VAR="#TOTO #TITI #TUTU #TATA"

OLD_IFS="$IFS"
export IFS="#"

for i in $VAR ; do echo "#$i" ; done |sed -e '/^\#$/d'

export IFS="$OLD_IFS"
Lilian.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 16h43   #12
Membre éclairé
 
Homme Lilian Herault
Architecte technique
Inscription : juin 2010
Messages : 215
Détails du profil
Informations personnelles :
Nom : Homme Lilian Herault
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Architecte technique
Secteur : Industrie

Informations forums :
Inscription : juin 2010
Messages : 215
Points : 335
Points : 335
Lorsque tu dis que l'on se rapproche, que te manque-t-il ?

Lilian.
lilian_h est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/05/2011, 16h57   #13
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Et avec "awk" ?

Code :
1
2
3
4
5
$ echo "#TOTO #TITI #TU TU #TA TA" | awk '{ gsub(" #","\n#",$0) ; print $0 }'
#TOTO
#TITI
#TU TU
#TA TA
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 17h30   #14
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
Merci à tous ça marche correctement avec :
Code :
1
2
echo "#TOTO #TITI #TUTU #TATA" | sed 's/\(#\)/\<ENTREE>
\1/g' | sed '1d'
La dernière solution de lilian_h marche également

Bonne fin de journée
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/05/2011, 23h30   #15
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

avec ksh93 :
Code :
1
2
3
4
5
6
7
$ var="#TOTO #TITI #TUTU #TATA"
$ IFS=' #' read -A Array <<<"$var"
$ printf '#%s\n' "${Array[@]:1}"
#TOTO
#TITI
#TUTU
#TATA
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/05/2011, 09h46   #16
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Sinon, quand je bosse sur de l'AIX/HPUX/... j'utilise souvent perl pour éviter de me prendre la tête

Perl est presque toujours installé partout, fonctionne à peu près toujours pareil sur les trucs de base, permet d'écrire un programme simple très rapidement et reste assez efficace en terme de performances... exemple sur 1'000'000 de mots créés avec Les infos sur le fichier d'exemple et sa création (1ère ligne):
Code :
1
2
3
4
5
6
7
$ perl -e '@t=("TOTO", "TITI", "TU TU", "TA TA"); for ($i=0; $i<1000000; $i++) {print "#".$t[int(rand($#t+1))]," ";} print "#END\n";' > test_saut.txt
$ cut -c1-50 test_saut.txt #pour vérifier qu'il a le format attendu ;)
#TU TU #TA TA #TA TA #TITI #TITI #TA TA #TOTO #TOT
$ wc test_saut.txt #nombre de mots
      1 1499911 6499915 test_saut.txt
$ du -h test_saut.txt #taille du fichier
6.3M    test_saut.txt
Le traitement :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$ perl -ne 's/ #/\n#/g; print' test_saut.txt > result_perl_saut.txt
$ head result_perl_saut.txt
#TU TU
#TA TA
#TA TA
#TITI
#TITI
#TA TA
#TOTO
#TOTO
#TA TA
#TITI
Et en terme de perfs, c'est correct :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ time perl -ne 's/ #/\n#/g; print' test_saut.txt > result_perl_saut.txt
 
real    0m0.449s
user    0m0.376s
sys     0m0.040s
$ time awk '{ gsub(" #","\n#",$0) ; print $0 }' test_saut.txt > result_awk_saut.txt
 
real    0m0.410s
user    0m0.352s
sys     0m0.036s
$ time sed 's/\(#\)/\
\1/g' test_saut.txt | sed '1d' >  result_sed_saut.txt
 
real    0m0.959s
user    0m0.920s
sys     0m0.040s
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/05/2011, 10h33   #17
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
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 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par Alek-C Voir le message
Sinon, quand je bosse sur de l'AIX/HPUX/... j'utilise souvent perl pour éviter de me prendre la tête

$ time sed 's/\(#\)/\
\1/g' test_saut.txt | sed '1d' > result_sed_saut.txt

real 0m0.959s
user 0m0.920s
sys 0m0.040s
[/code]
là forcément avec sed .... | sed ça prend longtemps..

tu devrais enchainer
Code :
1
2
sed 's/\(#\)/\
\1/g;1d' fichier > fichier
pour gagner un peu de temps. exemple sur un fichier de moins de 1ko
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
[fpu@line ~/tmp] time sed 's/\(#\)/\
\1/g;1d' a > b
 
real    0m0.003s
user    0m0.000s
sys     0m0.004s
[fpu@line ~/tmp] time sed 's/\(#\)/\1g' a | sed '1d' > b
sed: -e expression n°1, caractère 11: commande `s' inachevée
 
real    0m0.013s
user    0m0.004s
sys     0m0.004s
[fpu@line ~/tmp]
le gain est plus que manifeste !
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/05/2011, 10h49   #18
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Re-

Citation:
du devrais enchainer
Code :

Code :
1
2
sed 's/\(#\)/\
\1/g;1d' fichier > fichier
Le "1d" est inutile si on emploi la bonne syntaxe dans la 1ère expression :

Il y a un espace en début d'expression
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 11h32   #19
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par frp31 Voir le message
là forcément avec sed .... | sed ça prend longtemps..
...
sed: -e expression n°1, caractère 11: commande `s' inachevée
...
[/code]
le gain est plus que manifeste !
C'est sur qu'avec une erreur, le gain est manifeste :p (désolé)

En plus, je peux me gourer, mais d'après mes tests, quand tu mets le 1d, ça vire la première ligne ... et le reste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sed 's/\(#\)/\
> \1/g;1d' test_saut.txt | head
$ sed -e 's/\(#\)/\
> \1/g' -e1d  test_saut.txt | head
$ sed -e 's/\(#\)/\
> \1/g' test_saut.txt | head
 
> #TU TU
> #TA TA
> #TA TA
> #TITI
> #TITI
> #TA TA
> #TOTO
> #TOTO
> #TA TA
Edit: sinon, j'avais pris cet exemple car c'est celui retenu par notre ami (mais il n'est clairement pas le meilleur selon moi).

Et pour faire plaisir à zipe31 (qui a cependant entièrement raison, sauf que pour une raison qui restera un mystère, ça ne fonctionne pas chez Cj_Dal) :
Code :
1
2
3
4
5
$ time sed 's/ \(#\)/\n\1/g' test_saut.txt > result_sed_saut.txt
 
real    0m0.725s
user    0m0.700s
sys     0m0.024s
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 11h37   #20
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 49
Points : 37
Points : 37
Zipe31, pour info, ta solution ne marche pas chez moi, les retours à la ligne ne s'effectuent pas

Alek-C, on m'a également dit du bien de PERL mais il n'est pas installé sur notre environnement, merci quand même

frp31, le fait de placer un ;1d dans le premier sed ne m'affiche plus rien... j'ai l'air d'avoir un environnement vraiment particulier

NB : désolé de pas reprendre les bouts de code, je ne connais pas la balise qu'il faut utiliser
Cj_Dal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h01.


 
 
 
 
Partenaires

Hébergement Web