PERL- Enlever mêmes lignes d'un fichier [Fermé]

Signaler
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
-
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
-
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

6 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
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:~#
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
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)
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
une idée?
Messages postés
127
Date d'inscription
mercredi 9 avril 2008
Statut
Membre
Dernière intervention
30 janvier 2009
5
merci!!!!
je vais essayer ca!!!