Rechercher : dans
Par :

PERL- Enlever mêmes lignes d'un fichier

Dernière réponse le 17 avr 2008 à 14:01:28 tonixm, le 17 avr 2008 à 11:50:32 
 Signaler ce message aux modérateurs

Bonjour,

Comment faire pour enlever les lignes apparaissant plusieurs fois dans un fichier et n'en garder qu'une seule.

Par exemple: fichier tmp:

Apr 17 11:42:36 chatelet kernel: scsi1:0:2:0: Device is active, asserting ATN
Apr 17 11:42:36 chatelet kernel: Recovery code sleeping
Apr 17 11:42:36 chatelet kernel: (scsi1:A:2:0): Abort Message Sent
Apr 17 11:42:36 chatelet kernel: (scsi1:A:2:0): SCB 3 - Abort Completed.
Apr 17 11:42:36 chatelet kernel: Recovery SCB completes
Apr 17 11:42:36 chatelet kernel: Recovery code awake
Apr 17 11:42:36 chatelet kernel: aic7xxx_abort returns 0x2002
Apr 17 11:43:38 chatelet kernel: (scsi1:A:2:0): parity error detected in Data-in
phase. SEQADDR(0x53) SCSIRATE(0x98)
Apr 17 11:42:36 chatelet kernel: (scsi1:A:2:0): SCB 3 - Abort Completed.
Apr 17 11:43:38 chatelet kernel: (scsi1:A:2:0): parity error detected in Data-in
phase. SEQADDR(0x53) SCSIRATE(0x98)
Apr 17 11:44:38 chatelet kernel: scsi1:0:2:0: Attempting to queue an ABORT messa
ge
Apr 17 11:44:38 chatelet kernel: CDB: 0x1a 0x8 0x1d 0x0 0x18 0x0
Apr 17 11:44:38 chatelet kernel: scsi1: At time of recovery, card was not paused
Apr 17 11:44:38 chatelet kernel: >>>>>>>>>>>>>>>>>> Dump Card State Begins <<<<<
<<<<<<<<<<<<
Apr 17 11:44:38 chatelet kernel: scsi1: Dumping Card State in Message-in phase,
at SEQADDR 0x172
Apr 17 11:44:38 chatelet kernel: Card was paused
Apr 17 11:43:38 chatelet kernel: (scsi1:A:2:0): parity error detected in Data-in
phase. SEQADDR(0x84) SCSIRATE(0x98)
Apr 17 11:43:38 chatelet kernel: (scsi1:A:2:0): parity error detected in Data-in
phase. SEQADDR(0x85) SCSIRATE(0x98)

et enlever les lignes qui apparaissent plusieurs fois pour a la fin obtenir dans ce même fichier tmp:

Apr 17 11:42:36 chatelet kernel: scsi1:0:2:0: Device is active, asserting ATN
Apr 17 11:42:36 chatelet kernel: Recovery code sleeping
Apr 17 11:42:36 chatelet kernel: (scsi1:A:2:0): Abort Message Sent
Apr 17 11:42:36 chatelet kernel: (scsi1:A:2:0): SCB 3 - Abort Completed.
Apr 17 11:42:36 chatelet kernel: Recovery SCB completes
Apr 17 11:42:36 chatelet kernel: Recovery code awake
Apr 17 11:42:36 chatelet kernel: aic7xxx_abort returns 0x2002
Apr 17 11:43:38 chatelet kernel: (scsi1:A:2:0): parity error detected in Data-in
phase. SEQADDR(0x53) SCSIRATE(0x98)
Apr 17 11:44:38 chatelet kernel: scsi1:0:2:0: Attempting to queue an ABORT messa
ge
Apr 17 11:44:38 chatelet kernel: CDB: 0x1a 0x8 0x1d 0x0 0x18 0x0
Apr 17 11:44:38 chatelet kernel: scsi1: At time of recovery, card was not paused
Apr 17 11:44:38 chatelet kernel: >>>>>>>>>>>>>>>>>> Dump Card State Begins <<<<<
<<<<<<<<<<<<
Apr 17 11:44:38 chatelet kernel: scsi1: Dumping Card State in Message-in phase,
at SEQADDR 0x172
Apr 17 11:44:38 chatelet kernel: Card was paused
Apr 17 11:43:38 chatelet kernel: (scsi1:A:2:0): parity error detected in Data-in
phase. SEQADDR(0x84) SCSIRATE(0x98)


je ne sais vraiment pas comment faire

Merci

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « PERL Enlever mêmes lignes d'un fichier » dans :
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Publier un fichier PDF sur son site VoirSommaire: Publier un PDF sur son site Conseils Afficher un PDF intégré à une page Téléchargement Convertir un PDF en SWF (Flash) Publier le SWF Astuces et conseils Publier un PDF sur son site Publier un fichier PDF en ligne est en...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...

1

tonixm, le 17 avr 2008 à 11:53:08

J'ai entendu, si je ne me trompe pas d'utiliser des tables de hachage, mais alors je ne vois vraiment pas comment procéder

Répondre à tonixm

2

lami20j, le 17 avr 2008 à 12:22:06

Salut,

voici un idiome Perl ;-)

root@debian:~# cat tonixm.txt
aaa
bbb
bbb
ccc
ddd
ddd
eee
fff
root@debian:~# cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

open LIRE,"tonixm.txt";

my %vu=();
my @unique;
@unique = grep { ! $vu{$_} ++ } <LIRE>;
print for @unique;

__END__
root@debian:~# perl ccm.pl
aaa
bbb
ccc
ddd
eee
fff
root@debian:~#
106485010510997108

Répondre à lami20j

3

tonixm, le 17 avr 2008 à 13:22:25

Merci lami20j comme d'hab ;)

par contre marche t'il de cette manière c'est a dire en mettant le resulat dans un autre fichier:

open LIRE,"tonixm.txt";
open ECRIRE ,">tonixm.focal";
my %vu=();
my @unique;
@unique = grep { ! $vu{$_} ++ } <LIRE>;
print ECRIRE @unique;

au final aurais-je dans tonixm.focal ??:
aaa
bbb
ccc
ddd
eee
fff

si dans tonixm.txt j'ai:
aaa
bbb
bbb
ccc
ddd
ddd
eee
fff


(cf ton exemple)

Répondre à tonixm

4

lami20j, le 17 avr 2008 à 14:00:22
  • +1

Oui, bien sûr ;-)

root@debian:~# cat tonixm.txt
aaa
bbb
bbb
ccc
ddd
ddd
eee
fff
root@debian:~# cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

open LIRE,"tonixm.txt";
open ECRIRE ,">tonixm.focal";
my %vu=();
my @unique;
@unique = grep { ! $vu{$_} ++ } <LIRE>;
print ECRIRE @unique;
__END__
root@debian:~# perl ccm.pl
root@debian:~# cat tonixm.focal
aaa
bbb
ccc
ddd
eee
fff
root@debian:~#
Voici une autre version sans @unique
root@debian:~# cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

open ECRIRE ,">tonixm.focal";
my %vu=();
print ECRIRE grep { ! $vu{$_} ++ } qx/cat tonixm.txt/;
__END__
Cette fois l'écriture se fait directement dans le fichier tonixm.focal 106485010510997108

Répondre à lami20j

5

tonixm, le 17 avr 2008 à 14:00:36

Une idée?

Répondre à tonixm

6

 tonixm, le 17 avr 2008 à 14:01:28

Merci!!!!
je vais essayer ca!!!

Répondre à tonixm