Conversion de fichier en shell
Sentenza
-
jipicy Messages postés 41342 Statut Modérateur -
jipicy Messages postés 41342 Statut Modérateur -
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:"")
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:
- Conversion de fichier en shell
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Classic shell - Télécharger - Personnalisation
10 réponses
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 :
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]$ ;-))
#!/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
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
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
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
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ésultatlami20j@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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re,
une variante plus directe sans utiliser le tableau pour stockage de fichier (en revanche je ne traite pas les lignes avec #)
P.S. Et pour que ça soit vraiment du kanji voilà le code sur une seule ligne.
=))
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=();}
Cher lami20j, Sentenza a demandé le script en shell ^^ C'est clair que python ou perl sont plus adaptés mais bon ;)
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 ^^
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
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