PERL- Enlever mêmes lignes d'un fichier

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
Configuration: Windows XP
Internet Explorer 7.0

6 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. tonixm Messages postés 127 Statut Membre 4
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. tonixm Messages postés 127 Statut Membre 4
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tonixm Messages postés 127 Statut Membre 4
     
    une idée?
    0
  7. tonixm Messages postés 127 Statut Membre 4
     
    merci!!!!
    je vais essayer ca!!!
    0