Découper un fichier texte de taille variable

Résolu/Fermé
Signaler
Messages postés
6
Date d'inscription
lundi 10 septembre 2012
Statut
Membre
Dernière intervention
11 septembre 2012
-
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
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

Messages postés
2
Date d'inscription
vendredi 7 septembre 2012
Statut
Membre
Dernière intervention
10 septembre 2012

je reboot sur linux et je te fait ca ;)
normalement grâce a un script c'est faisable, et facilement :)
0
Messages postés
2
Date d'inscription
vendredi 7 septembre 2012
Statut
Membre
Dernière intervention
10 septembre 2012

Ton fichier a-t'il un nom particulier ou veux tu pouvoir le rentré?
0
Messages postés
6
Date d'inscription
lundi 10 septembre 2012
Statut
Membre
Dernière intervention
11 septembre 2012

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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 587
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
Messages postés
6
Date d'inscription
lundi 10 septembre 2012
Statut
Membre
Dernière intervention
11 septembre 2012

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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 587
Qu'appelles-tu champ ?
Quelle 1ère ligne ?

Un exemple concret s'il te plaît, merci.
0
Messages postés
6
Date d'inscription
lundi 10 septembre 2012
Statut
Membre
Dernière intervention
11 septembre 2012

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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 587
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
Messages postés
6
Date d'inscription
lundi 10 septembre 2012
Statut
Membre
Dernière intervention
11 septembre 2012

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
Messages postés
18405
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
16 janvier 2022
5 527
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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 587
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
Messages postés
6
Date d'inscription
lundi 10 septembre 2012
Statut
Membre
Dernière intervention
11 septembre 2012

Enorme ! Ca marche nickel !! Chapeau Môssieur !

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

A+
0
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 587
De rien ;-)
0