[UNIX] Crée un décompactage

Résolu
Karamurat Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   -  
Karamurat Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   -
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 {~_^}

--
°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°°`°`°º¤ø,¸¸
°`°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°` °`°~ l'effet Tsunami UNIX ... {~_^}
Configuration: Windows XP
Firefox 2.0.0.6

9 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    #! /bin/bash
    
    while read ligne
    do
       NOM=${ligne% *}
       VALEUR=${ligne#*: }
    
       for i in $(seq ${VALEUR/-/ })
       do 
             echo "$NOM $i"
       done
    done < fichier
    ;-))
    0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    Hello
    j'essayerais ça :

    awk -F'[:-]' '{for(x=$2 ; x <=$3 ; x++) print(%s: %d\n", $1, x)}'
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  3. Marc
     
    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
  4. Karamurat Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   2
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Bon petit, fini de faire mumuse, allez zou, au lit !!! ;-DDDDD



      Chapeau man ;-))
      0
  9. karamurat
     
    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
  10. Karamurat Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   2
     
    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