PERL- Enlever mêmes lignes d'un fichier

Fermé
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 - 17 avril 2008 à 11:50
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 - 17 avril 2008 à 14:01
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
A voir également:

6 réponses

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 567
17 avril 2008 à 14:00
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
1
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
17 avril 2008 à 11:53
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
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 567
17 avril 2008 à 12:22
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:~#
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
17 avril 2008 à 13:22
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)
0

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

Posez votre question
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
17 avril 2008 à 14:00
une idée?
0
tonixm Messages postés 127 Date d'inscription mercredi 9 avril 2008 Statut Membre Dernière intervention 30 janvier 2009 4
17 avril 2008 à 14:01
merci!!!!
je vais essayer ca!!!
0