Découper un fichier texte de taille variable

Résolu
christophe06 Messages postés 6 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je cherche à découper des fichiers textes qui ont toujours la même structure mais dont le nombre de ligne varie. Exemple :

TITRE_A
Ligne_A1
Ligne_A2
...
Ligne_An
<ligne_vide>
TITRE_B
Ligne_B1
Ligne_B2
...
Ligne_Bn

Sachant que d'un fichier à l'autre, An et Bn varient...
et que je veux créer 2 fichiers textes contenant respectivement les infos A et B.

Je maitrise pas du tout les commandes unix. Quelqu'un aurait-il une idée de comment faire ?

Merci pour votre aide
Cordialement

Christophe

4 réponses

  1. Luipx Messages postés 3 Statut Membre
     
    je reboot sur linux et je te fait ca ;)
    normalement grâce a un script c'est faisable, et facilement :)
    0
    1. Luipx Messages postés 3 Statut Membre
       
      Ton fichier a-t'il un nom particulier ou veux tu pouvoir le rentré?
      0
    2. christophe06 Messages postés 6 Statut Membre
       
      Merci pour ton aide.
      Je dois en fait processer un grand nombre de fichier qui s'appellent tous data_ana.csv et dont je vais récupérer l'emplacement via cette commande.

      find . -name "data_ana.csv" -print

      Le but in fine est de concaténer toutes les lignes A dans un même fichier, toutes les lignes B dans un autre fichier...

      Thxs !
      0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Contenu du répertoire :
     $ ls
    plop  scrit.sed


    Contenu du fichier "plop" (ton fichier)
    $ cat plop 
    TITRE_A
    Ligne_A1
    Ligne_A2
    ...
    Ligne_An
    
    TITRE_B
    Ligne_B1
    Ligne_B2
    ...
    Ligne_Bn


    Contenu du fichier script.sed (fichier qui sera passé en argument à la commande "sed")
    $ cat scrit.sed 
    #n
    0,/^$/{
    w fichierA
    }
    /^$/,${
    /^$/b
    w fichierB
    }
    


    Exécution de la commande "sed"
    $ sed -f scrit.sed plop 


    Contenu du répertoire :
    $ ls
    fichierA  fichierB  plop  scrit.sed


    Contenu des fichiers "fichierA" et "fichierB"
    $ cat fichierA
    TITRE_A
    Ligne_A1
    Ligne_A2
    ...
    Ligne_An
    
    
    $ cat fichierB
    TITRE_B
    Ligne_B1
    Ligne_B2
    ...
    Ligne_Bn
    
    

    0
    1. christophe06 Messages postés 6 Statut Membre
       
      Merci bp ; c'est exactement ce que je recherche. Ca marche très bien.

      Puis-je abuser ?
      - En fait, j'ai 3 champs A, B et C (et non pas 2) ; comment adapter le script sed ??
      - Comment supprimer la 1ere ligne ?

      Encore merci !
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Qu'appelles-tu champ ?
      Quelle 1ère ligne ?

      Un exemple concret s'il te plaît, merci.
      0
    3. christophe06 Messages postés 6 Statut Membre
       
      Ok, excuse-moi. Mon cas concret :

      Des fichiers de mêmes noms, de mêmes format, dans des répertoires différents :
      ./01/data_ana.csv
      ./02/data_ana.csv
      ./03/data_ana.csv
      ./04/data_ana.csv
      ...
      Il y en a beaucoup !

      Un format unique pour chaque fichier composé de 3 parties :

      TITRE_A
      Ligne_A1
      Ligne_A2
      ...
      Ligne_An

      TITRE_B
      Ligne_B1
      Ligne_B2
      ...
      Ligne_Bn

      TITRE_C
      Ligne_C1
      Ligne_C2
      ...
      Ligne_Cn

      (j'avais zappé la 3eme partie car je préjugeais de mes capacités à adapter des scripts :-)

      Mon besoin :
      Avoir au final 3 fichiers distincts fileA, fileB et fileC dans lesquels sont concaténées les lignes d'une même partie de tous les fichiers.

      J'ai également besoin de supprimer la ligne TITRE que je connais par ailleurs.

      Merci beaucoup !
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      j'avais zappé la 3eme partie car je préjugeais de mes capacités à adapter des scripts
      Oui mais du coup mon script ne vaut plus rien ;-((

      j'ai également besoin de supprimer la ligne TITRE que je connais par ailleurs.
      Que tu connais ou que tu connais pas ?
      Si tu les connais ça m'arrange, dans le cas contraire ça risque d'être plus ardu et l'emploi de "awk" (exemple de dubcek) sera plus adapté je pense...
      0
    5. christophe06 Messages postés 6 Statut Membre
       
      Oui, dsl pour le premier script...

      Les titres sont les mêmes pour tous les fichiers et commencent tous par le mot DATE. Voici les 3 titres complets :


      DATE;HEURE;IRRADIANCE 1;IRRADIATION 1;IRRADIANCE 2;IRRADIATION 2;TEMP. AMBIANTE 1;TEMP. AMBIANTE 2;TEMP. SURFACE 1;TEMP. SURFACE 2

      DATE;HEURE;TENSION COMPOSEE U21;TENSION COMPOSEE U32;TENSION COMPOSEE U13;TENSION RESIDUELLE;INTENSITE PH 1;INTENSITE PH 2;INTENSITE PH 3;FREQUENCE

      DATE;HEURE;ENERGIE ACTIVE POS;ENERGIE ACTIVE NEG;ENERGIE REACTIVE POS;ENERGIE REACTIVE NEG;PUISSANCE ACTIVE P;PUISSANCE REACTIVE Q
      0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ awk '/^TITRE/ {f=$1} {print > f}' fichier
    $
    $ more T*
    ::::::::::::::
    TITRE_A
    ::::::::::::::
    TITRE_A
    Ligne_A1
    Ligne_A2
    ...
    Ligne_An
    <ligne_vide>
    ::::::::::::::
    TITRE_B
    ::::::::::::::
    TITRE_B
    Ligne_B1
    Ligne_B2
    ...
    Ligne_Bn
    $ 
    
    0
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Contenu répertoire
     $ ls
    f1  f2  f3  script.sed


    Contenu des fichiers f1 f2 f3
    $ head f*
    ==> f1 <==
    DATE;HEURE;IRRADIANCE 1;IRRADIATION 1;IRRADIANCE 2;IRRADIATION 2;TEMP. AMBIANTE 1;TEMP. AMBIANTE 2;TEMP. SURFACE 1;TEMP. SURFACE 2
    Ligne_A1_F1
    Ligne_A2
    ...
    Ligne_An
    
    DATE;HEURE;TENSION COMPOSEE U21;TENSION COMPOSEE U32;TENSION COMPOSEE U13;TENSION RESIDUELLE;INTENSITE PH 1;INTENSITE PH 2;INTENSITE PH 3;FREQUENCE
    Ligne_B1_F1
    Ligne_B2
    ...
    
    ==> f2 <==
    DATE;HEURE;IRRADIANCE 1;IRRADIATION 1;IRRADIANCE 2;IRRADIATION 2;TEMP. AMBIANTE 1;TEMP. AMBIANTE 2;TEMP. SURFACE 1;TEMP. SURFACE 2
    Ligne_A1_F2
    Ligne_A2
    ...
    Ligne_An
    
    DATE;HEURE;TENSION COMPOSEE U21;TENSION COMPOSEE U32;TENSION COMPOSEE U13;TENSION RESIDUELLE;INTENSITE PH 1;INTENSITE PH 2;INTENSITE PH 3;FREQUENCE
    Ligne_B1_F2
    Ligne_B2
    ...
    
    ==> f3 <==
    DATE;HEURE;IRRADIANCE 1;IRRADIATION 1;IRRADIANCE 2;IRRADIATION 2;TEMP. AMBIANTE 1;TEMP. AMBIANTE 2;TEMP. SURFACE 1;TEMP. SURFACE 2
    Ligne_A1_F3
    Ligne_A2
    ...
    Ligne_An
    
    DATE;HEURE;TENSION COMPOSEE U21;TENSION COMPOSEE U32;TENSION COMPOSEE U13;TENSION RESIDUELLE;INTENSITE PH 1;INTENSITE PH 2;INTENSITE PH 3;FREQUENCE
    Ligne_B1_F3
    Ligne_B2
    ...


    Contenu script.sed
    $ cat script.sed 
    #n
    /;IRRADIANCE /,/^$/{
    //b
    w irradiance.txt
    }
    /;TENSION COMPOSEE/,/^$/{
    //b
    w tension.txt
    }
    /;ENERGIE ACTIVE/,${
    /;ENERGIE ACTIVE/b
    w energie.txt
    }
    


    Exécution sur l'ensemble des fichiers
    $ sed -s -f script.sed f*


    Contenu répertoire
    $ ls
    energie.txt  f1  f2  f3  irradiance.txt  script.sed  tension.txt


    Contenu des 3 fichiers créés
    $ cat irradiance.txt 
    Ligne_A1_F1
    Ligne_A2
    ...
    Ligne_An
    Ligne_A1_F2
    Ligne_A2
    ...
    Ligne_An
    Ligne_A1_F3
    Ligne_A2
    ...
    Ligne_An
    
    $ cat tension.txt 
    Ligne_B1_F1
    Ligne_B2
    ...
    Ligne_Bn
    Ligne_B1_F2
    Ligne_B2
    ...
    Ligne_Bn
    Ligne_B1_F3
    Ligne_B2
    ...
    Ligne_Bn
    
    $ cat energie.txt 
    Ligne_C1_F1
    Ligne_C2
    ... 
    Ligne_Cn
    Ligne_C1_F2
    Ligne_C2
    ... 
    Ligne_Cn
    Ligne_C1_F3
    Ligne_C2
    ... 
    Ligne_Cn


    ;-))
    0
    1. christophe06 Messages postés 6 Statut Membre
       
      Enorme ! Ca marche nickel !! Chapeau Môssieur !

      Au plaisir de te redemander de l'aide :-)

      A+
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      De rien ;-)
      0