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 27/08/2007, 13h18   #1
Invité de passage
 
Inscription : juillet 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 26
Points : 3
Points : 3
Par défaut Crée un décompactage

Bonjour

Quel serait la commande la plus simple possible mais qui reste aussi la plus fiable de décompacter cette liste :

Code :
1
2
3
4
5
6
 
lawsoncompanyF: 4010-4020
lawsoncompanyF: XR: 3010-3012
lawsoncompanyF: 4050-4052
lawsoncompanyF: 4069
lawsoncompanyF: AP: 4060
pour l' obtention de cette liste :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lawsoncompanyF: 4010
lawsoncompanyF: 4011
lawsoncompanyF: 4012
lawsoncompanyF: 4013
lawsoncompanyF: 4014
lawsoncompanyF: 4015
lawsoncompanyF: 4016
lawsoncompanyF: 4017
lawsoncompanyF: 4018
lawsoncompanyF: 4019
lawsoncompanyF: 4020
lawsoncompanyF: XR: 3010
lawsoncompanyF: XR: 3011
lawsoncompanyF: XR: 3012
lawsoncompanyF: 4050
lawsoncompanyF: 4051
lawsoncompanyF: 4052
lawsoncompanyF: 4069
lawsoncompanyF: AP: 4060
Merci D'avance {~_^}
karamurat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 08h17   #2
Invité de passage
 
Inscription : juillet 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 26
Points : 3
Points : 3
voila j'ai sous la main deux commande une avec "awk" et l'autre avec "perl"
celle de awk :
Code :
awk -F'[:-]' '{for(x=$2 ; x <=$3 ; x++) printf("%s: %d\n", $1, x)}' < decompactage
et l'autre avec perl :
Code :
perl -ne '/(.*?:)\s*(\d+)-(\d+)/;for $e($2 .. $3){ print "$1 $e\n" }' decompactage
ce qui me donne pour sortie :

perl :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
dev4: ./script_decompactage_3.sh
lawsoncompanyF: 4010
lawsoncompanyF: 4011
lawsoncompanyF: 4012
lawsoncompanyF: 4013
lawsoncompanyF: 4014
lawsoncompanyF: 4015
lawsoncompanyF: 4016
lawsoncompanyF: 4017
lawsoncompanyF: 4018
lawsoncompanyF: 4019
lawsoncompanyF: 4020
lawsoncompanyF: XR: 3010
lawsoncompanyF: XR: 3011
lawsoncompanyF: XR: 3012
lawsoncompanyF: XR: 3013
lawsoncompanyF: XR: 3014
lawsoncompanyF: XR: 3015
lawsoncompanyF: XR: 3016
lawsoncompanyF: XR: 3017
lawsoncompanyF: XR: 3018
lawsoncompanyF: XR: 3019
lawsoncompanyF: XR: 3020
lawsoncompanyF: 4050
lawsoncompanyF: 4051
lawsoncompanyF: 4052
5 0
dev4:
tout d'abord un probleme le " 5 0 " a la fin de la liste (en rouge ),
ainsi qu'il manque les deux compagnie :
lawsoncompanyF: 4069
lawsoncompanyF: AP: 4060

et awk :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dev4: ./script_decompactage_2.sh
lawsoncompanyF: 4010
lawsoncompanyF: 4011
lawsoncompanyF: 4012
lawsoncompanyF: 4013
lawsoncompanyF: 4014
lawsoncompanyF: 4015
lawsoncompanyF: 4016
lawsoncompanyF: 4017
lawsoncompanyF: 4018
lawsoncompanyF: 4019
lawsoncompanyF: 4020
lawsoncompanyF: 4050
lawsoncompanyF: 4051
lawsoncompanyF: 4052
dev4:
pour awk il manque
lawsoncompanyF: 4069
lawsoncompanyF: AP: 4060

ainsi que le decompactege de
lawsoncompanyF: XR: 3010-3012

je touche donc presque la solution , j'aurais donc besoin d'aides pour combler les erreurs , ou ajouter une option etc ...
pour pouvoir avoir au final cette liste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lawsoncompanyF: 4010
lawsoncompanyF: 4011
lawsoncompanyF: 4012
lawsoncompanyF: 4013
lawsoncompanyF: 4014
lawsoncompanyF: 4015
lawsoncompanyF: 4016
lawsoncompanyF: 4017
lawsoncompanyF: 4018
lawsoncompanyF: 4019
lawsoncompanyF: 4020
lawsoncompanyF: XR: 3010
lawsoncompanyF: XR: 3011
lawsoncompanyF: XR: 3012
lawsoncompanyF: 4050
lawsoncompanyF: 4051
lawsoncompanyF: 4052
lawsoncompanyF: 4069
lawsoncompanyF: AP: 4060
Merci d'avance
karamurat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 08h43   #3
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 970
Points : 1 377
Points : 1 377
Essaye ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
awk '
{
 n=split($NF,a,"-")
 if(n==1) print $0
 else {
   sub("." $NF,"")
   for(i=a[1];i<=a[2];i++) {
    print $0 " " i
   }
 }
}
'
Sous Solaris, remplacer awk par nawk.
jlliagre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 13h43   #4
Invité de passage
 
Inscription : juillet 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 26
Points : 3
Points : 3
Merci ! vraiment je suis trop content , pourrait tu m'expliquer un peu? car je n'ai pas trop compris ton script a part qu'il fonctionne , je suis suis super content !

Merci encore
karamurat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 01h12   #5
Membre Expert
 
Avatar de jlliagre
 
Inscription : juin 2007
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 970
Points : 1 377
Points : 1 377
Le même avec des commentaires.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
awk '
{
# NF est le nombre de champs
# $NF est la valeur du dernier champs
# split découpe ce dernier champs en morceaux en prenant "-" comme séparateur
# split retourne le nombre de morceaux trouvés
# split construit un tableau nommé "a"
 n=split($NF,a,"-")
# s'il n'y a qu'un morceau, on affiche la ligne originale ($0) , pas de traitement donc
 if(n==1) print $0
# sinon, il y a une plage a traiter: 
 else {
# on supprime le dernier champs et le caractère qui le précède dans $0
   sub("." $NF,"")
# pour chaque valeur 
   for(i=a[1];i<=a[2];i++) {
# on affiche $0 tronqué suivi du numero voulu
    print $0 " " i
   }
 }
}
'
jlliagre 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 11h14.


 
 
 
 
Partenaires

Hébergement Web