[UNIX] Crée un décompactage
Résolu/Fermé
Karamurat
Messages postés
43
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
4 janvier 2011
-
27 août 2007 à 13:21
Karamurat Messages postés 43 Date d'inscription jeudi 12 juillet 2007 Statut Membre Dernière intervention 4 janvier 2011 - 28 août 2007 à 09:24
Karamurat Messages postés 43 Date d'inscription jeudi 12 juillet 2007 Statut Membre Dernière intervention 4 janvier 2011 - 28 août 2007 à 09:24
A voir également:
- [UNIX] Crée un décompactage
- Cree un compte google - Guide
- Comment créer un groupe whatsapp - Guide
- Créer un compte gmail - Guide
- Créer un compte instagram sur google - Guide
- Créer un lien pour partager des photos - Guide
9 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
27 août 2007 à 13:45
27 août 2007 à 13:45
Salut,
#! /bin/bash while read ligne do NOM=${ligne% *} VALEUR=${ligne#*: } for i in $(seq ${VALEUR/-/ }) do echo "$NOM $i" done done < fichier;-))
dubcek
Messages postés
18769
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 mars 2025
5 629
27 août 2007 à 13:46
27 août 2007 à 13:46
Hello
j'essayerais ça :
j'essayerais ça :
awk -F'[:-]' '{for(x=$2 ; x <=$3 ; x++) print(%s: %d\n", $1, x)}'
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
27 août 2007 à 14:01
27 août 2007 à 14:01
Salut,
Chapeau bas ;-)
Je me permet juste de rectifier pour un guillemet et un "f" d'absent :
Chapeau bas ;-)
Je me permet juste de rectifier pour un guillemet et un "f" d'absent :
awk -F'[:-]' '{for(x=$2 ; x <=$3 ; x++) printf("%s: %d\n", $1, x)}';-))
Bonjour,
Voilà mon fichier test :
/bnp/SREC0eiD/tmp>cat testMCA
lawsoncompanyF: 4010-4020
testXXXXF: 4050-4052
/bnp/SREC0eiD/tmp>
Voilà mon script :
/bnp/SREC0eiD/tmp>cat script.sh
#!/bin/sh
for ligne in `cat testMCA | sed 's/: /:_/g`; do
nom=`echo $ligne | sed 's/\(.*\):_.*/\1/'`
borneInf=`echo $ligne | sed "s/$nom:_\(.*\)-.*/\1/"`
borneSup=`echo $ligne | sed "s/$nom:_.*-\(.*\)/\1/"`
current=$borneInf
while [ $current -le $borneSup ]; do
echo $nom: $current
current=`expr $current + 1`
done
done
/bnp/SREC0eiD/tmp>
Et voilà ce que ca donne :
/bnp/SREC0eiD/tmp>./script.sh
lawsoncompanyF: 4010
lawsoncompanyF: 4011
lawsoncompanyF: 4012
lawsoncompanyF: 4013
lawsoncompanyF: 4014
lawsoncompanyF: 4015
lawsoncompanyF: 4016
lawsoncompanyF: 4017
lawsoncompanyF: 4018
lawsoncompanyF: 4019
lawsoncompanyF: 4020
testXXXXF: 4050
testXXXXF: 4051
testXXXXF: 4052
/bnp/SREC0eiD/tmp>
Je reste disponible pour toute explication.
Bonne journée !
Marc
Voilà mon fichier test :
/bnp/SREC0eiD/tmp>cat testMCA
lawsoncompanyF: 4010-4020
testXXXXF: 4050-4052
/bnp/SREC0eiD/tmp>
Voilà mon script :
/bnp/SREC0eiD/tmp>cat script.sh
#!/bin/sh
for ligne in `cat testMCA | sed 's/: /:_/g`; do
nom=`echo $ligne | sed 's/\(.*\):_.*/\1/'`
borneInf=`echo $ligne | sed "s/$nom:_\(.*\)-.*/\1/"`
borneSup=`echo $ligne | sed "s/$nom:_.*-\(.*\)/\1/"`
current=$borneInf
while [ $current -le $borneSup ]; do
echo $nom: $current
current=`expr $current + 1`
done
done
/bnp/SREC0eiD/tmp>
Et voilà ce que ca donne :
/bnp/SREC0eiD/tmp>./script.sh
lawsoncompanyF: 4010
lawsoncompanyF: 4011
lawsoncompanyF: 4012
lawsoncompanyF: 4013
lawsoncompanyF: 4014
lawsoncompanyF: 4015
lawsoncompanyF: 4016
lawsoncompanyF: 4017
lawsoncompanyF: 4018
lawsoncompanyF: 4019
lawsoncompanyF: 4020
testXXXXF: 4050
testXXXXF: 4051
testXXXXF: 4052
/bnp/SREC0eiD/tmp>
Je reste disponible pour toute explication.
Bonne journée !
Marc
Karamurat
Messages postés
43
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
4 janvier 2011
2
27 août 2007 à 15:29
27 août 2007 à 15:29
Vraiment excellent !
après vérif , j'ai fais un autre test avec cette liste, j'ai un peu changer les choses ;) :
donc voila une nouvelle liste:
en lancent le script avec les deux méthode proposer , j'ai eu une sortie avec uniquement les compagnies avec le tiret du milieu et sans XR: devant le numero de compagnie :
c'est a dire j'ai eu exactement ça :
Au lieu de ça :
Merci encore et d'avance !
après vérif , j'ai fais un autre test avec cette liste, j'ai un peu changer les choses ;) :
donc voila une nouvelle liste:
lawsoncompanyF: 4010-4020 lawsoncompanyF: XR: 3010-3012 lawsoncompanyF: 4050-4052 lawsoncompanyF: 4069 lawsoncompanyF: AP: 4060
en lancent le script avec les deux méthode proposer , j'ai eu une sortie avec uniquement les compagnies avec le tiret du milieu et sans XR: devant le numero de compagnie :
c'est a dire j'ai eu exactement ça :
lawsoncompanyF: 4010 lawsoncompanyF: 4011 lawsoncompanyF: 4012 lawsoncompanyF: 4013 lawsoncompanyF: 4014 lawsoncompanyF: 4015 lawsoncompanyF: 4016 lawsoncompanyF: 4017 lawsoncompanyF: 4018 lawsoncompanyF: 4019 lawsoncompanyF: 4020 lawsoncompanyF: 4051 lawsoncompanyF: 4052
Au lieu de ça :
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 encore et d'avance !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
27 août 2007 à 16:10
27 août 2007 à 16:10
Change pour la ligne en gras/italique (en fait il n'y a qu'un dièse (#) à rajouter) et rajoute celles en gras :
#! /bin/bash # set -xv while read ligne do NOM=${ligne% *} VALEUR=${ligne##*: } echo ${VALEUR} | grep "-" >/dev/null if [ "$?" != 0 ] then echo $NOM ${VALEUR} continue fi for i in $(seq ${VALEUR/-/ }) do echo "$NOM $i" done done <;-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
27 août 2007 à 16:44
27 août 2007 à 16:44
Salut,
pour m'amuser un peu :-) je ne suis pas entrer dans les détails :-))
lami20j
pour m'amuser un peu :-) je ne suis pas entrer dans les détails :-))
root@debian:~# cat ccm.pl #!/usr/bin/perl while (<>){ ($v) = $_ =~ /^(.*?:)\s/ if 1 .. 1; /^$v\s+(\d+)-(\d+)/; @h{$1 .. $2}=$v; } print map { "$v $_\n" } sort keys %h; root@debian:~# cat aaa lawsoncompanyF: 4010-4020 lawsoncompanyF: 4050-4052 root@debian:~# perl ccm.pl aaa 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 root@debian:~#--
lami20j
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
27 août 2007 à 20:33
27 août 2007 à 20:33
toujours pour s'amuser ;-)
:~/trash$ cat aaa lawsoncompanyF: 4010-4020 lawsoncompanyF: 4050-4052 :~/trash$ perl -ne '/(.*?:)\s*(\d+)-(\d+)/;for $e($2 .. $3){ print "$1 $e\n" }' aaa 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 :~/trash$
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
27 août 2007 à 20:38
27 août 2007 à 20:38
Bon petit, fini de faire mumuse, allez zou, au lit !!! ;-DDDDD
Chapeau man ;-))
Chapeau man ;-))
alors la je suis vraiment K.O technique ! je ne savais pas que la commande "perl" était aussi puissant que ça ,
seulement peut on inclure les valeurs avec les compagnies sans le tiret (-) ainsi que le (AP:) sachant que sa pourrait être autre que AP: mais XR: ou FR: etc ...
c'est a dire ceci :
la fonction proposer avec "perl" et "awk" me semble la meilleure solution ,
Pourrait on inclure une commande a cette fonction perl ou awk qui permettrai de récupérer les compagnie seul c'est a dire comme celle cité en haut ,
car avec la méthode "perl" , tout fct a merveille sauf qu'il manque les compagnie seul et que il'ya un " 5 0 " qui apparait a la fin,
Voila Merci encore ;)
seulement peut on inclure les valeurs avec les compagnies sans le tiret (-) ainsi que le (AP:) sachant que sa pourrait être autre que AP: mais XR: ou FR: etc ...
c'est a dire ceci :
lawsoncompanyF: 4069 lawsoncompanyF: AP: 4060
la fonction proposer avec "perl" et "awk" me semble la meilleure solution ,
Pourrait on inclure une commande a cette fonction perl ou awk qui permettrai de récupérer les compagnie seul c'est a dire comme celle cité en haut ,
car avec la méthode "perl" , tout fct a merveille sauf qu'il manque les compagnie seul et que il'ya un " 5 0 " qui apparait a la fin,
dev4: dev4: cat script_decompactage_3.sh perl -ne '/(.*?:)\s*(\d+)-(\d+)/;for $e($2 .. $3){ print "$1 $e\n" }' testMCA dev4: dev4:
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 testXXXXF: 4050 testXXXXF: 4051 testXXXXF: 4052 5 0 dev4:
Voila Merci encore ;)
Karamurat
Messages postés
43
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
4 janvier 2011
2
28 août 2007 à 09:24
28 août 2007 à 09:24
ok , j'ai la solution merci a tous !
{^_^} MERCI !!!
awk ' { n=split($NF,a,"-") if(n==1) print $0 else { sub("." $NF,"") for(i=a[1];i<=a[2];i++) { print $0 " " i } } } '
{^_^} MERCI !!!