[scripts unix] - gestion fichiers

david_m Messages postés 2 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

Voilà mon soucis: je ne suis pas bon en scripts Unix! (shell, perl, awk, sed ..)
En fait, je souhaite transformer un fichier de la forme:

textepeuimportelecontenu1
VALEUR
{
valx
}
textepeuimportelecontenu2
VALEUR
{
valy
}
textepeuimportelecontenu2

--> donc c'est un fichier "relativement" construit. j'ai un deuxième fichier qui liste un ensemble de valeurs:
...
val1.1
val x.x
...

--> je souhaite parcourir le fichier 1, puis dans chaque bloc de type :
VALEUR
{
...
}

, vérifier que la valeur entre les 2 {} est bien dans le fichier 2

Si c'est le cas, conserver le bloc dans le fichier 1
Sinon, supprimer le bloc dans le fichier 1.

Voilà j'ai beaucoup détaillé, je sais que en awk, on peut faire beaucoup de choses, mais là je ne suis pas sûr que cela suffise.

J'ai peur de me lancer dans du dév. pour revenir régulièrement en arrière, je sollicite donc votre aide. Si vous avez des pistes, même un début j'accepte.

d'avance merci

david m.

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Moi je ferais un petit script en python ou en perl, en utilisant des expressions régulières. Je te suggère de regarder un petit tutorial sur google pour voir comment tout ça marche.

    Bonne chance
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Voilà un petit exemple.
    Le fichier 1 je ne le modifie pas, je l'utilise seulement pour lire les données, ensuite je compare avec les données du fichier 2. Le résultat est écrit dans le fichier 3.

    Je n'ai pas testé tous le possibilité (texte n'importe quel contenu c'est un peu vaste). C'est vrai que les expressions régulières sont puissantes, mais il faut savoir la structure de texte à traiter.
    Le script et un example
    #! /usr/bin/perl -w
    use strict;
    
    $/="\n\n\n"; # à cause des sautes de ligne que j'ai ajouté avant VALEUR
    # s'il n'y a pas de saute de ligne avant VALEUR $/="" suffit
    
    my @vec;
    my @valeur;
    
    open FVALEUR,"/home/lamitest/david_m1.txt" ;
    my $ligne=<FVALEUR>;
    $ligne =~ s/valeur\n/:valeur/ig;
    $ligne =~ s/{\n/{/g;
    $ligne =~ s/\n}/}:/g;
    my @ligne= split /:/, $ligne;
    close FVALEUR;
    
    open FCOMPARE,"/home/lamitest/david_m2.txt"
            or die "Impossible d'ouvrir le fichier : $!\n";
    
    while (my $val = <FCOMPARE>){
            chomp($val);
            push @valeur,$val;
    }
    close FCOMPARE;
    
    foreach my $x(@ligne){
            if ($x!~/valeur{(\d+)}/i){
                    push (@vec,$x);
            }elsif ($x=~/(valeur{(\d+)})/i){
                    push @vec,"\U$1" if (grep /$2/,@valeur);
            }
    
    }
    
    open FECRIRE,"> /home/lamitest/david_m_res.txt"
            or die "Impossible de créer le fichier : $!";
    
    foreach(@vec){
            s/valeur/\Uvaleur\n/i;
            s/{/{\n/;
            s/}/\n}/;
            print FECRIRE;
    }
    close FECRIRE;
    

    Fichier 1. Données lues
    [lamitest@localhost ~]$ cat david_m1.txt
    Le ficier N°1 ou se trouve des données et du texte
    Dans le fichier n°2 les chiffre : 250 et 22
    textepeuimportelecontenu1
    ligne 1
    Ce bloc doit rester
    
    VALEUR
    {
    250
    }
    ligne2
    textepeuimportelecontenu2
    
    VALEUR
    {
    137
    }
    bla bbla
    textepeuimportelecontenu2
    textepeuimportelecontenu1
    Ce bloc doit rester
    VALEUR
    {
    22
    }
    textepeuimportelecontenu2
    texte à ajouter
    VALEUR
    {
    10257
    }
    textepeuimportelecontenu2
    
    [lamitest@localhost ~]$
    

    Fichir 2 - valeurs à comparer
    [lamitest@localhost ~]$ cat david_m2.txt
    22
    250
    30
    [lamitest@localhost ~]$
    

    Fichier 3 - les blocs dont les valeurs correspondent sont écrits
    [lamitest@localhost ~]$ cat david_m_res.txt
    Le ficier N°1 ou se trouve des données et du texte
    Dans le fichier n°2 les chiffre  250 et 22
    textepeuimportelecontenu1
    ligne 1
    Ce bloc doit rester
    
    VALEUR
    {
    250
    }
    ligne2
    textepeuimportelecontenu2
    
    
    bla bbla
    textepeuimportelecontenu2
    textepeuimportelecontenu1
    Ce bloc doit rester
    VALEUR
    {
    22
    }
    textepeuimportelecontenu2
    texte à ajouter
    
    textepeuimportelecontenu2
    
    [lamitest@localhost ~]$
    
    0
    1. david_m Messages postés 2 Statut Membre
       
      d'abord merci pour ton aide.
      Quand je dis textenimportequelcontenu, c'est vraiment que cela peut-être n'importe quoi. En lisant (décryptant...) le script, il me semble que j'ai omis de dire une chose:
      Dans textenimportequelcontenu, il peut y avoir
      VALEUR2
      {
      valx
      }

      Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.

      En tout cas je continue ...
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > david_m Messages postés 2 Statut Membre
         
        Salut,

        Si j'ai bien compris le script, les traitements se font par rapport aux accolades, dans mon cas ce serait plûtôt par rapport à VALEUR.

        Pas tout à fait. Le traitement et fait par rapport au

        VALEUR
        {
        val
        }

        Un VALEUR2 ne me dérange pas du tout. Mais en ce cas si tu fait une copie coller d'une partie de ton fichier pour voir la structure, je n'aurai qu'à faire quelques petites modifications.

        Je vais insérer aussi des commentaires pour comprendre exactement comme il fonctionne.

        Par exemple:
        open FVALEUR,"/home/lamitest/david_m1.txt" ;
        my $ligne=<FVALEUR>;
        $ligne =~ s/valeur\n/:valeur/ig;
        $ligne =~ s/{\n/{/g;
        $ligne =~ s/\n}/}:/g;
        my @ligne= split /:/, $ligne;
        close FVALEUR;

        $ligne avale le fichier entier.

        Ensuite je remplace VALEUR\n avec :VALEUR pour pouvoir faire split par rapport aux :

        Si tu as VALEURn (n un numéro quelconque) on peut faire ça
        $ligne =~ s/valeur(d*)?\n/:valeur$1/ig;


        En ce cas ? reconnaît ou pas une chiffre ou plusieurs.
        ? quantificateur optionnel
        * rien ou une chiffre,2chiffre,...........
        En ce cas est reconnu VALEUR, VALEUR2, VALEUR222,.....

        C'est bien de savoir si tu as toujours

        VALEURn
        {
        val
        }

        Voilà la modification
        ===============================================
        $/="";
        
        my @vec;
        my @valeur;
        
        open FVALEUR,"/home/lamitest/david_m1.txt" ;
        my $ligne=<FVALEUR>;
        $ligne =~ s/valeur(\d*)?\n/:valeur$1/ig;# reconnaît VALEUR,VALEUR1,VALEUR22,..
        $ligne =~ s/{\n/{/g;
        $ligne =~ s/\n}/}:/g;
        my @ligne= split /:/, $ligne;
        close FVALEUR;
        
        open FCOMPARE,"/home/lamitest/david_m2.txt"
                or die "Impossible d'ouvrir le fichier : $!\n";
        
        while (my $val = <FCOMPARE>){
                chomp($val);
                push @valeur,$val;
        }
        close FCOMPARE;
        
        foreach my $x(@ligne){
                if ($x!~/valeur(\d*)?{(\d+)}/i){
                        push (@vec,$x);
                }elsif ($x=~/(valeur(?:\d*)?{(\d+)})/i){
                        push @vec,"\U$1" if (grep /$2/,@valeur);
                }
        
        }
        
        open FECRIRE,"> /home/lamitest/david_m_res.txt"
                or die "Impossible de créer le fichier : $!";
        
        foreach(@vec){
                s/valeur(\d*)?/\Uvaleur$1\n/i;
                s/{/{\n/;
                s/}/\n}/;
                print FECRIRE;
        }
        close FECRIRE;
        

        0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Exemple:

    Fichier1
    [lamitest@localhost ~]$ cat david_m1.txt
    Le ficier N°1 ou se trouve des données et du texte
    Dans le fichier n°2 les chiffre : 250 et 22
    textepeuimportelecontenu1
    ligne 1
    Ce bloc doit rester
    VALEUR
    {
    250
    }
    ligne2
    textepeuimportelecontenu2
    VALEUR
    {
    137
    }
    bla bbla
    textepeuimportelecontenu2
    textepeuimportelecontenu1
    Ce bloc doit rester
    VALEUR2
    {
    22
    }
    textepeuimportelecontenu2
    texte à ajouter
    VALEUR
    {
    10257
    }
    textepeuimportelecontenu2
    
    [lamitest@localhost ~]$
    

    Fichier 2
    [lamitest@localhost ~]$ cat david_m2.txt
    22
    250
    30
    [lamitest@localhost ~]$

    Résultat
    [lamitest@localhost ~]$ cat david_m_res.txt
    Le ficier N°1 ou se trouve des données et du texte
    Dans le fichier n°2 les chiffre  250 et 22
    textepeuimportelecontenu1
    ligne 1
    Ce bloc doit rester
    VALEUR
    {
    250
    }
    ligne2
    textepeuimportelecontenu2
    
    bla bbla
    textepeuimportelecontenu2
    textepeuimportelecontenu1
    Ce bloc doit rester
    VALEUR2
    {
    22
    }
    textepeuimportelecontenu2
    texte à ajouter
    
    textepeuimportelecontenu2
    
    [lamitest@localhost ~]$
    
    0