PERL- Enlever mêmes lignes d'un fichier
tonixm
Messages postés
127
Statut
Membre
-
tonixm Messages postés 127 Statut Membre -
tonixm Messages postés 127 Statut Membre -
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
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
6 réponses
-
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 @uniqueroot@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 -
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
-
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:~# -
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) -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-