[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
Bonjour

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

lawsoncompanyF: 4010-4020
lawsoncompanyF: 4050-4052



pour l' obtention de cette liste :

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



Merci D'avance {~_^}

A voir également:

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 895
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
;-))
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
27 août 2007 à 13:46
Hello
j'essayerais ça :

awk -F'[:-]' '{for(x=$2 ; x <=$3 ; x++) print(%s: %d\n", $1, x)}'
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 août 2007 à 14:01
Salut,

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)}' 
;-))
0
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
0
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
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:

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 !
0

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 895
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 < 
;-))
0
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 567
27 août 2007 à 16:44
Salut,

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
0
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 567
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$
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 août 2007 à 20:38
Bon petit, fini de faire mumuse, allez zou, au lit !!! ;-DDDDD



Chapeau man ;-))
0
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 :
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 ;)
0
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
ok , j'ai la solution merci a tous !

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 !!!
0