Découper un fichier texte de taille variable
Résolu
christophe06
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 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
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
A voir également:
- Découper un fichier texte de taille variable
- Comment réduire la taille d'un fichier - Guide
- Fichier bin - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
4 réponses
je reboot sur linux et je te fait ca ;)
normalement grâce a un script c'est faisable, et facilement :)
normalement grâce a un script c'est faisable, et facilement :)
Salut,
Contenu du répertoire :
Contenu du fichier "plop" (ton fichier)
Contenu du fichier script.sed (fichier qui sera passé en argument à la commande "sed")
Exécution de la commande "sed"
Contenu du répertoire :
Contenu des fichiers "fichierA" et "fichierB"
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
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 !
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 !
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...
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...
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
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
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 $
Contenu répertoire
Contenu des fichiers f1 f2 f3
Contenu script.sed
Exécution sur l'ensemble des fichiers
Contenu répertoire
Contenu des 3 fichiers créés
;-))
$ 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
;-))
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 !