Perl: Extraction de données d'un fichier text

Hello !

Grâce à vous tous et aux tutoriels sur internet, j'ai réussi à faire tourner sous Unix mes premiers programmes perl.

Il y a cependant quelque chose que je ne parviens pas à faire:

Comment on extrait des données d'un fichier texte ?
Je m'explique:

Voici par exemple mon fichier texte fichier1.txt :

okokokok x y t w a
aaaaa 1 2 3 4 5
45678 2 9 8 4 3

J'aimerais creer À partir de ce fichier un autre fichier texte fichier2.txt qui contiendrait juste les colonnes t et a:

nouveau fichier texte fichier2.txt:

# t a
3 5
8 3

Quelqu'un sait faire ca ? Ou me mettre sur la voie ?
merci.
Miguel

7 réponses

  1. Modérateur
    Re,

    Une autre solution (maintenant je suis en pause).

    #! /usr/bin/perl
    
    use warnings;
    
    @ARGV = qw (/home/lami/fifto.txt);
    open FIC_W,">","/home/lami/fifto_res.txt"
    		or die "Impossible de creer le fichier : $!_n";
    while (<>){
    	s/(.*)/join " ",(split " ", $1)[3,5]/e;
    	print FIC_W $_;
    }


    Le résultat
    [root@localhost ~]# cat /home/lami/fifto.txt
    okokok x y t w a
    aaaaa 1 2 3 4 5
    45678 2 9 8 4 3
    [root@localhost ~]# ls /home/lami/fifto_res.txt
    ls: /home/lami/fifto_res.txt: Aucun fichier ou répertoire de ce type
    [root@localhost ~]# perl ccm_fifto2
    [root@localhost ~]# cat /home/lami/fifto_res.txt
    t a
    3 5
    8 3
    [root@localhost ~]#
    
    2
    1. Modérateur
      Salut,

      vite fait avant partir au boulot (c'est la grève aujourd'hui)

      [lamitest@localhost corbeille]$ cat ccm_file_fifto
      okokokok x y t w a
      aaaaa 1 2 3 4 5
      45678 2 9 8 4 3
      [lamitest@localhost corbeille]$ perl -pi.orig -e 's/[\w\s]+(\w\s)\w\s(\w\s)/$1$2/g' ccm_file_fifto
      [lamitest@localhost corbeille]$ cat ccm_file_fifto
      t a
      3 5
      8 3
      [lamitest@localhost corbeille]$
      
      1
      1. Salut les experts,

        Les bouts de codes ci-dessus me donnent déjà quelques pistes de réflexion, cependant étant totalement novice en programmation . . . J'ai quelques difficultés à les adapter à mon cas . . . :s

        Grosso modo, j'ai quelques milliers de fichiers textes (7300 pour être très précis) et ces .txt contiennent des infos comme présenté ci-après :


        3 PARAMETERS ON 05JAN01.
        1 AZU1 STA X -0.247297943318988E+07 +- 0.241394876950605E-02
        2 AZU1 STA Y -0.467133800760033E+07 +- 0.374164031593362E-02
        3 AZU1 STA Z 0.355810775092403E+07 +- 0.257172727253398E-02
        2 1 0.571958818322482E+00
        3 1 -0.659378461245129E+00
        3 2 -0.847505892381651E+00
        AZU1 ANTENNA LC 0.1636 0.0000 0.0000 !up north east (m)


        Pour traiter ces données, il faudrait que crée un tableau excel, avec les 3 valeurs en gras, situées dans 3 colonnes différentes. Je suis donc au tout début du processus, puisque je compte extraire ces 3 valeurs et les placer dans un fichier texte, pour ensuite créer un .xls.

        Pour extraire ces 3 valeurs, je comptais utiliser grep (comme dans l'exemple de script bash), et je réussis évidemment à extraire mes 3 valeurs, mais sur des lignes différentes . . . Comment faire pour que l'output dans le txt se fasse sur une ligne ?

        Si quelqu'un a une idée . . .
        D'avance merci . . .
        Yoda.
        1
        1. Up up up!!
          Moi aussi je suis intéressé ;)
          Merci d'avance.
          0
      2. Bonjour,
        #!/usr/bin/perl -w
        use strict;
        use warnings;
        
        open(FILE, "fichier1.txt") || die "Erreur E/S : $!\n";
        my @contenu = <FILE>;
        close(FILE);
        
        open(FILE, "fichier2.txt") || die "Erreur E/S : $!\n";
        foreach (@contenu) {
            my @datas = split(/ /, $_);
            print FILE "$datas[3] $datas[5]\n";
        }
        close(FILE);
        


        Philippe
        0
        1. la fonction split "éclate" la chaine stockée dans la variable $_ en fonction du délimiteur se trouvant entre les /, donc ici le caractère blanc.
          (voir perldoc -f split)
          Le résultat est stocké dans le tableau @datas

          Pour récupérer les lignes 102 et 105, un simple test sur $datas[0] devrait suffire.

          Philippe
          0
          1. Modérateur
            Salut,

            Si je puis me permettre, puisque tu es sous Unix, avec un simple filtre comme "grep" (ou "egrep") et un "pipe" ( | ) avec "awk" devrait faire l'affaire. En ligne de commande :
            [jp@MDK tmpfs]$ cat file.txt
            okokokok x y t w a
            101 1 2 3 4 5
            102 2 9 8 4 3
            103 5 4 8 7 3
            104 5 9 8 7 6
            105 2 5 7 8 9
            
            [jp@MDK tmpfs]$ egrep "102|105" file.txt | awk '{ print $4" " $6 }'
            8 3
            7 9
            
            Ou dans un script :
            [jp@MDK tmpfs]$ cat batch.sh
            #! /bin/bash
            
            egrep "$1|$2" < file.txt | awk '{ print $4" "$6 }'
            
            [jp@MDK tmpfs]$ sh batch.sh 102 105
            8 3
            7 9
            
            [jp@MDK tmpfs]$
            ;-))
            0
            1. merci Philippe !

              Il y a cependant une ligne que je capte pas:

              my @datas = split(/ /, $_);

              en particulier split(//,$_)

              je dois effectivement comprendre ca car en fait, ce que je dois faire plus précisément c'est ca:

              le fichier fichier1.txt ressemble à ca en fait:

              okokokok x y t w a
              101 1 2 3 4 5
              102 2 9 8 4 3
              103 5 4 8 7 3
              104 5 9 8 7 6
              105 2 5 7 8 9

              Et je dois extraire non seulement les colonnes t a, mais seulement pour les lignes 102 et 105 par exemple.

              le fichier2.txt doit donc etre le suivant au final:

              # t a
              8 3
              7 9
              -1