Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2011, 11h44   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 8
Points : 0
Points : 0
Par défaut Shell - Report d'1 champ sur plusieurs lignes

Bonjour,

J'ai un fichier à format fixe que je dois charger sous Oracle en SQL*Loader. Mon fichier contient différents types de lignes (défini par le 1er caractère) : une ligne d'entête (type A) et des lignes de détail (type B ou C). Avant le chargement, le fichier est découpé en 3 : les entêtes d'un côté et les 2 différents types de détail de l'autre, qui partiront vers 3 tables différentes ensuite sous Oracle.

Problème : je dois reporter un champ de la ligne d'entête vers ses lignes de détails. Et impossible de le faire après sous Oracle car ce champ sert justement à faire le lien entre les 2 tables. L'ordre du fichier est séquentiel soit :
A Entête1 Champ_a_reporter
B Détail1
C Détail1
A Entête2 Champ_a_reporter
B Détail2
...

=> L'objectif est donc de reporter un champ de la ligne de type A vers toutes ses lignes de types autres que A (soit celles qui précèdent la prochaine ligne de type A).

Est-ce réalisable en shell ? et si oui je veux bien un peu d'aide parce que je sèche là

Merci d'avance
coco_mtl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 16h50   #2
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
pas sur d'avoir tout compris, mais voilà peut-être un début de réponse ?

Code :
1
2
3
4
5
6
7
8
9
10
$ cat test.txt
A Entête1 Champ_a_reporter
B Détail1
C Détail1
A Entête2 Champ_a_reporter
B Détail2
$ awk '$1=="A" {entete=$2} $1!="A" {print entete" "$0}' test.txt
Entête1 B Détail1
Entête1 C Détail1
Entête2 B Détail2
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 17h52   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 8
Points : 0
Points : 0
Citation:
Envoyé par Alek-C Voir le message
pas sur d'avoir tout compris, mais voilà peut-être un début de réponse ?

Code :
1
2
3
4
5
6
7
8
9
10
$ cat test.txt
A Entête1 Champ_a_reporter
B Détail1
C Détail1
A Entête2 Champ_a_reporter
B Détail2
$ awk '$1=="A" {entete=$2} $1!="A" {print entete" "$0}' test.txt
Entête1 B Détail1
Entête1 C Détail1
Entête2 B Détail2
Oui c'est à peu près ça merci.
J'avais une autre solution en fait toujours avec awk et un substr (fichier au format fixe) donc je la met ici pour info (le champ est ajouté en fin de ligne) :

Citation:
awk '/^A/ {c=substr($0, 11, 17);print;next} {print $0, c} ' test.txt
coco_mtl est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h05.


 
 
 
 
Partenaires

Hébergement Web