Conversion de fichier en shell

Bonjour,

Je cherche a faire un script en shell pour convertir un fichier.
Avez vous des conseiles ou exemples a me donner.
Merci d'avance

Le fichier en entree est composé de valeurs separés par des ';'

Exemple :
#Colonne1;Colonne2;Colonne3;Colonne4;
0;Y;N;;
0;N;N;10;
0;N;N;11;
1;Y;N;;

Le fichier de sortie doit etre comme ceci :
(Colonne1:"0" Colonne2:"Y" Colonne3:"N" Colonne4:"")
(Colonne1:"0" Colonne2:"N" Colonne3:"N" Colonne4:"10")
(Colonne1:"0" Colonne2:"N" Colonne3:"N" Colonne4:"11")
(Colonne1:"1" Colonne2:"Y" Colonne3:"N" Colonne4:"")

10 réponses

  1. Modérateur
    Salut,

    Y'a surement plus simple (en PERL notamment, si lami20j passe par là ...), mais voilà avec un peu de "awk", ce que ça donne :
    [jp@MDK shm]$ cat fich.txt
    
    0;Y;N;;
    0;N;N;10;
    0;N;N;11;
    1;Y;N;;
    
    [jp@MDK shm]$ cat script.sh
    
    #!/bin/bash
    
    for i in $(cat fich.txt)
    do
            echo "$i" |\
            awk -F";" '{ printf \
            "%s\042%s\042\
            %s\042%s\042\
            %s\042%s\042\
            %s\042%s\042%s\n",\
            "(Colonne1:",$1,\
            "Colonne2:",$2,\
            "Colonne3:",$3,\
            "Colonne4:",$4,")" }'
    done
    
    [jp@MDK shm]$ sh script.sh
    
    (Colonne1:"0"   Colonne2:"Y"    Colonne3:"N"    Colonne4:"")
    (Colonne1:"0"   Colonne2:"N"    Colonne3:"N"    Colonne4:"10")
    (Colonne1:"0"   Colonne2:"N"    Colonne3:"N"    Colonne4:"11")
    (Colonne1:"1"   Colonne2:"Y"    Colonne3:"N"    Colonne4:"")
    
    [jp@MDK shm]$ 
    ;-))
    0
    1. Modérateur
      #!/bin/bash
      
      file_in=$1
      
      for line in $(cat $file_in); do
        i=1
        val=`echo $line | cut -d ";" -f$i`
        echo -ne "("
        while test "$val" != ""
        do
          echo -n "Colonne$i:\"$val\" "
          val=`echo $line | cut -d ";" -f$i`
          let i=i+1
        done
        echo ")"
      done

      On change les droits
      (mando@aldur) (~) $ chmod +x plop.sh

      Ensuite je mets un fichier d'exemple dans le fichier "plop"
      (mando@aldur) (~) $ cat plop
      plop;plop1;plop2
      plap;plap1;plap2
      plip;plip1;plip2

      Enfin je lance le script :
      (mando@aldur) (~) $ ./plop.sh plop
      (Colonne1:"plop" Colonne2:"plop" Colonne3:"plop1" Colonne4:"plop2" )
      (Colonne1:"plap" Colonne2:"plap" Colonne3:"plap1" Colonne4:"plap2" )
      (Colonne1:"plip" Colonne2:"plip" Colonne3:"plip1" Colonne4:"plip2" )
      

      Bonne chance
      0
      1. Modérateur
        Ah ben voilà jicipy a repondu en parallèle... Bon ben ça te fait deux méthodes, sauf que la miène marche pour tout nombre de colonne ;) Soit dit en passant il faut aussi que tu traites les lignes commençant par un #... Mais bon ça on va te laisser faire :p
        0
        1. Modérateur
          Bonsoir Miss, Jipicy et Sentenza,

          si lami20j passe par là ... Oui, je passe de temps en temps. Je ne peut pas oublier mes /amie?s/

          Bon ben ça te fait deux méthodes

          Plus bas la 3ème.

          sauf que la miène marche pour tout nombre de colonne ;)

          La mienne aussi( j'ai pensé de début que ça sera mieux de faire pour un nombre quelconque des colonnes ;) - j'ai vu le message de jipicy avant ton post - et j'étais content de voir qu'on est sur la même longueur d'onde ;)

          Soit dit en passant il faut aussi que tu traites les lignes commençant par un #... Mais bon ça on va te laisser faire :p

          J'ai l'avantage que je suis en dernier. Je vais traiter moi les lignes avec #.

          Avec l'espoir de ne pas vous decevoir, et si jamais killian fera un tour par ici - encore un peu de kanji :D

          Le script

          #!/usr/bin/perl
          #
          use warnings;use strict;
          
          open F_LIRE,"fic.txt" or die "E/S : $!\n";
          my (@v,%h,@t);
          
          while(<F_LIRE>){
            next if /^\#/;
            push @v,[split /;/,$_];
          }
          
          for (@v){
            grep {s/(.*)/"$1"/} @$_;
            @h{grep {s/(.*)/Colonne$1:/} 1..@$_-1} = @$_;
            for(sort keys %h){push @t,$_,$h{$_}," "}
            pop @t and print "(",@t,")\n" and @t=();
          }
          
          Le résultat
          lami20j@debian:~/trash$ cat fic.txt
          #Colonne1;Colonne2;Colonne3;Colonne4;Colonne5;
          0;Y;N;;Miss;
          0;N;N;10;Jipicy;
          0;N;N;11;Sentenza;
          1;Y;N;;lami20j;
          lami20j@debian:~/trash$ perl point_virgule.pl
          (Colonne1:"0" Colonne2:"Y" Colonne3:"N" Colonne4:"" Colonne5:"Miss")
          (Colonne1:"0" Colonne2:"N" Colonne3:"N" Colonne4:"10" Colonne5:"Jipicy")
          (Colonne1:"0" Colonne2:"N" Colonne3:"N" Colonne4:"11" Colonne5:"Sentenza")
          (Colonne1:"1" Colonne2:"Y" Colonne3:"N" Colonne4:"" Colonne5:"lami20j")
          lami20j@debian:~/trash$
          
          lami20j

          P.S. Y'a surement plus simple
          Avec la fatigue et les problèmes que j'ai je n'ai pas pu faire mieux.
          Je verai un autre jour. Merci
          0
          1. Modérateur
            Re,

            une variante plus directe sans utiliser le tableau pour stockage de fichier (en revanche je ne traite pas les lignes avec #)
            #!/usr/bin/perl
            #
            use warnings;use strict;
            
            for (map {[split /;/,$_]} `cat fic.txt`){
              my (%h,@t); grep {s/(.*)/"$1"/} @$_;
              @h{grep {s/(.*)/Colonne$1:/} 1..@$_-1} = @$_;
              for(sort keys %h){push @t,$_,$h{$_}," "}
              pop @t and print "(",@t,")\n" and @t=();
            }
            
            lami20j

            P.S. Et pour que ça soit vraiment du kanji voilà le code sur une seule ligne.
            =))
            #!/usr/bin/perl
            #
            use warnings;use strict;
            
            for (map {[split /;/,$_]} `cat fic.txt`){my (%h,@t);grep {s/(.*)/"$1"/} @$_;@h{grep {s/(.*)/Colonne$1:/} 1..@$_-1} = @$_;for(sort keys %h){push @t,$_,$h{$_}," "}pop @t and print "(",@t,")\n" and @t=();}
            
            0
            1. Modérateur
              Cher lami20j, Sentenza a demandé le script en shell ^^ C'est clair que python ou perl sont plus adaptés mais bon ;)
              0
              1. Modérateur
                C'est jipicy qui m'a provoqué. Et je suis d'accord avec toi. Mea culpa.

                lami20j
                0
            2. Modérateur
              Tu crois que si je lance une provoc à sebsauvage pour la version python ça marcherait aussi ? ^^
              0
              1. Modérateur
                Il est en vacances en ce moment et sans connection au Net (enfin si, mais en RTC)...

                Donc faudra remonter le topic en temps voulu(s).

                ;-))

                PS. Merci l'ami vingt J
                0
              2. Modérateur
                Salut,

                Ben, je vois que j'ai fâché le monde. Je ferai plus d'attention la prochaine fois.

                Bon Week-end à tous

                A+

                lami20j
                0
              3. Modérateur
                @lami20jje vois que j'ai fâché le monde
                OuKSa ??? :-\
                0
            3. Modérateur
              Moi j'ai pas trouvé que quelqu'un était fâché. En tout cas ça m'a bien fait rire de voir comment on s'est enflammés pour pondre trois programmes pour un truc tout simple ^^
              0
              1. Modérateur
                comment on s'est enflammés
                Avec les températures actuelles, c'était la moindre des choses :-DDD
                0
            4. Modérateur
              Salut,

              OuKSa ??? :-\

              Moi j'ai pas trouvé que quelqu'un était fâché.


              Tant mieux alors :D
              mauvaise interpretation, je devrait utiliser #!/bin/sh ;)

              En tout cas ça m'a bien fait rire de voir comment on s'est enflammés pour pondre trois programmes pour un truc tout simple ^^
              Peut être pour nous, mais pas pour Sentenza, mais c'est pareil je n'ai pas pris au sérieux.

              D'ailleurs la vraie solution shell c'est la tienne, rien à dire, chapeau.
              J'ai pris peut être une mauvaise habitude de m'amuser dans les posts qui demandent des solutions en shell.
              Comme ça je me garde en forme. Je préfère ça que de resoudre des sudoku.
              Parmi les petites choses que je connais (et ce n'est pas grand chose), malheureusement shell ne se trouve pas.

              Bonne journée à vous.

              lami20
              0
              1. Modérateur
                T'as qu'à sortir de ta coquille un peu ;-DDDDD
                0