cut (débutante) - Perl - Programmation
Marsh Posté le 15-06-2006 à 21:42:13
pour commencer, essaye de récupérer les paramètres passé par la ligne de commande (indice : faire des recherches sur le mot clé STDIN)
Marsh Posté le 15-06-2006 à 22:33:32
Désolé, mauvais manip, message en double.
lami20j
Marsh Posté le 15-06-2006 à 22:38:11
Salut,
Voilà un exemple en utilisant le fichier /etc/passwd ( le séparateur sera : )
Tu n'as qu'à remplacer : avec \s
1. avec handle F_LIRE
Code :
|
Résultat
Code :
|
2. ce que tu demandes (avec cat)
Code :
|
Le résultat
Code :
|
lami20j
Marsh Posté le 15-06-2006 à 22:48:05
Re,
à la place de
Code :
|
on peut écrire
Code :
|
lami20j
Marsh Posté le 15-06-2006 à 23:00:58
MERCI pour tes réponses :
Mais avec cat -e file_test | ./mon_script.pl 1 2 6
J'obtient :
use: Command not found.
use: Command not found.
my: Command not found.
Badly placed ()'s.
Marsh Posté le 15-06-2006 à 23:12:23
Re,
mayapour a écrit : MERCI pour tes réponses : |
tu peux afficher ici ton fichier? aussi le code que tu as écrit?
Pour voir où se trouve l'erreur.Merci.
lami20j
Marsh Posté le 15-06-2006 à 23:16:09
Monfichier file_test :
a1 a2 a3 a4 a5 a6
b1 b2 b3 b4 b5 b6 b7 b8 b9
c1 c2 c3 c4
d1 d2 d3 d4 d5 d6 d7 d8 d9
e1 e2
Mon code (enfin le tien;-)):
#!/usr/pkg/bin/perl -w
@col = splice(@ARGV,0,@ARGV);
while (<> ){
push @file, [split /,$_ ];
}
foreach (@file){
print "@$_[@col]";
}
Avec la commande cat -e file_test | ./mon_script.pl 1 2 6
J'obient maintenant : Badly placed ()'s.
Marsh Posté le 15-06-2006 à 23:27:17
Re,
tu n'as pas remplacer les deux-points : avec un espace \s
Ensuite le problème se complique un peu vu que les chaines n'ont pas le même nombre de termes separés par un espace.
Donc tu auras des messages d'erreurs concerntant l'initialisation des valeurs.
lami20j
Marsh Posté le 15-06-2006 à 23:27:47
toujours des mauvaises manipulations
Marsh Posté le 15-06-2006 à 23:31:14
J'ai remplacé les deux points par \s
Mais effectivement pas mieux
Marsh Posté le 16-06-2006 à 00:03:00
Re,
essaie ça. Ce n'est pas excellent(j'ai enlevé l'option -w pour ne pas voir les messages d'erreurs)
Il y a un antislash avant le s dans la regex de split
Code :
|
Chez moi ça marche
Code :
|
lami20j
Marsh Posté le 16-06-2006 à 00:03:54
toujours en double j'arrête pour ce soir. bonne continuation. lami20j
Marsh Posté le 16-06-2006 à 00:09:55
Je ne comprend pas pourquoi : idem
Badly placed ()'s.
???
MERCI pour cette solution qui me semble devoir fontionner ;-)
Marsh Posté le 16-06-2006 à 09:27:06
Salut,
mayapour a écrit : Je ne comprend pas pourquoi : idem |
Essaie d'exécuter avec
Code :
|
Pour ton erreur
Badly placed ()'s
(A) Vous lancez accidentellement votre script par csh au lieu de Perl. Vérifiez la ligne avec #!, ou lancez votre script manuellement dans Perl.
(A) Erreur externe (non générée par Perl).
Ca pourra te servir à l'avenir :
http://perl.enstimac.fr/DocFr/perldiag.html
lami20j
Marsh Posté le 16-06-2006 à 12:07:03
Re,
Peut être je devrais le devrait le faire de début pour comprendre ce que jai fait. Mea culpa.
Code :
|
while (<> ) va lire la sortie de cat fichier et dans la boucle je stocke dans un tableau des tableaux les éléments dont le séparateur est lespace.
Code :
|
Cette ligne stocke dans @col les arguments et vide @ARGV.
Pourquoi ?
Puisque la boucle while(<> ) lit dans @ARGV et comme 2, 3 et 4 ne sont pas des fichiers une exception sera levée.
Une fois @ARGV vide <> va lire seulement depuis pipe |
Code :
|
Pour affichage on va utiliser une tranche de tableau.
Comme @col contient les arguments 2, 4 et 6 par exemple je vais afficher pour chaque élément (qui est un tableau anonyme) du @file, uniquement les éléments 2, 4 et 6 qui correspondent à la colonne 3, 5 et 7 de ton fichier.
En suivant cet algo (à savoir que ce nest pas le meilleur et en plus quand on est en Perl il ne faut pas oublier TMTOWTDI Theres More Than One Way To Do It Il y a plusieurs façon de le faire) tu peux écrire toi-même le code ainsi tu comprendras mieux et tu éviteras aussi les erreurs de syntaxe.
A savoir que tu auras toujours des messages Warning si les lignes de ton fichier ne contiennent pas le même nombre déléments. Donc peut être il faut une autre approche pour traiter ça.
Un warning nest pas forcément une erreur mais une information.
Si tu enlèves w ou use warnings tu nauras pas les messages warnings. A toi de voir.
Je vais penser pour une autre approche.
Par exemple tu peux utiliser la commande cut dant ton script (voir man cut). Tu peux le faire avec la fonctin system
(voir dans la doc - http://perl.enstimac.fr/DocFr/perl [...] em_system)
Si tu ne comprends pas, fait un signe. Merci.
lami20j
Marsh Posté le 15-06-2006 à 21:21:56
Bonjour,
Je cherche à faire un petit script en PERL qui lira l'entree standard et delimitera celle-ci en colonnes
avec comme caractere separateur l'espace. On prend en parametre la liste des colonnes à afficher.
Pour exemple quand je lance :
$>cat -e file_test | mon_script.pl 1 7 3 5
Je veux afficher :
les colonnes 1 3 5 et 7 du fichier file_test (les colonnes sont uniquement compossés de chiffres en dur séparés par un espace)
Je ne sais pas par où commencer ?
Des idées ?
MERCI de m'éclairer ...
Message édité par mayapour le 15-06-2006 à 21:32:17