Conversion de fichier en shell

Fermé
Sentenza - 21 juil. 2006 à 18:14
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 22 juil. 2006 à 14:55
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:"")
A voir également:

10 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 896
21 juil. 2006 à 20:18
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
mamiemando Messages postés 33426 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 décembre 2024 7 809
21 juil. 2006 à 20:39
#!/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
mamiemando Messages postés 33426 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 décembre 2024 7 809
21 juil. 2006 à 20:40
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
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
21 juil. 2006 à 23:54
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
22 juil. 2006 à 00:15
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
mamiemando Messages postés 33426 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 décembre 2024 7 809
22 juil. 2006 à 00:46
Cher lami20j, Sentenza a demandé le script en shell ^^ C'est clair que python ou perl sont plus adaptés mais bon ;)
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 569
22 juil. 2006 à 00:42
C'est jipicy qui m'a provoqué. Et je suis d'accord avec toi. Mea culpa.

lami20j
0
mamiemando Messages postés 33426 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 décembre 2024 7 809
22 juil. 2006 à 01:32
Tu crois que si je lance une provoc à sebsauvage pour la version python ça marcherait aussi ? ^^
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 896
22 juil. 2006 à 08:11
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
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
22 juil. 2006 à 10:05
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
22 juil. 2006 à 10:13
je vois que j'ai fâché le monde
OuKSa ??? :-\
0
mamiemando Messages postés 33426 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 décembre 2024 7 809
22 juil. 2006 à 13:40
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
22 juil. 2006 à 13:46
comment on s'est enflammés
Avec les températures actuelles, c'était la moindre des choses :-DDD
0
mamiemando Messages postés 33426 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 décembre 2024 7 809
22 juil. 2006 à 13:55
:-)
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 569
22 juil. 2006 à 14:39
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
22 juil. 2006 à 14:55
T'as qu'à sortir de ta coquille un peu ;-DDDDD
0