[UNIX] Crée un décompactage

Résolu
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. Modérateur
    Salut,
    #! /bin/bash
    
    while read ligne
    do
       NOM=${ligne% *}
       VALEUR=${ligne#*: }
    
       for i in $(seq ${VALEUR/-/ })
       do 
             echo "$NOM $i"
       done
    done < fichier
    ;-))
    1. Contributeur
      Hello
      j'essayerais ça :

      awk -F'[:-]' '{for(x=$2 ; x <=$3 ; x++) print(%s: %d\n", $1, x)}'
      1. Modérateur
        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)}' 
        ;-))
    2. 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
      1. 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 !
        1. Modérateur
          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 < 
          ;-))
          1. Modérateur
            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
            1. Modérateur
              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$
              
              1. Modérateur
                Bon petit, fini de faire mumuse, allez zou, au lit !!! ;-DDDDD

                Chapeau man ;-))
            2. 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 ;)
              1. 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 !!!