Contaténer des fichiers avec des colonnes différentes [UNIX] - Shell/Batch - Programmation
Marsh Posté le 29-04-2003 à 13:48:50
awk est spécialement conçu pour ça!
Il est multi-fichier mais là c'est pas simple (jamais fait).
En fait il y a des colonnes communes et d'autres qui ne sont que dans 1 ou bien dans 2?
Avant de lancer awk je verrais un pré-calcul sur chque 1ère ligne de fichier n pour compter le nombre final de colonnes qu'il faudra.
Tu lis et si tu l'as pas déjà tu auras 1 colonne de +
Le but étant de préparer la 1ère colonne du fichier final (avec un BEGIN{} pour chaque fichier en entrée)
Ensuite c'est du remplissage, tu mets la colonne x du fichier n dans la bonne colonne en sortie ou sinon un code pour "rien".
Mais c'est chaud car ça utilise les tableaux et le multi-fichier avec BEGIN, toutes les options puissantes mais pas simples d'AWK.
Un lien que j'aime bien:
http://www.ai.univ-paris8.fr/~fb/Cours/MRD/awk.html
Marsh Posté le 29-04-2003 à 14:01:57
phosphorus68 a écrit : awk est spécialement conçu pour ça! |
merci BEAUCOUP pour ton aide . Je vais y réfléchir
Marsh Posté le 29-04-2003 à 14:16:58
Raaah, ça me revient que maintenant!
Une fonction que j'ai jamais utilisé personnellement mais très puissante: uniq (enfin un prg pas une fct)
Pour avoir toutes les colonnes de tous les fichiers une fois et une seule:
head -1 de chaque fichier (ou bien ne traiter avec AWK que la 1ère ligne qd NR==1)
Boucle for qui traite les NF colonnes de chaque fichier: dans la boucle tu écris une colonne par ligne en sortie
A B C
A B D E
deviendra
A
B
C
A
B
D
E
tu envoies ça (par pipe ou par relecture d'un fichier temporaire)
à sort et surtout uniq qui ne gardera que:
A
B
C
D
E
et là tu reprends AWK pour en refaire une longue ligne plutôt qu'une haute colonne (concaténer avec printf sans retour à la ligne mais un tab à la place $0\t et pas $0\n)
Marsh Posté le 29-04-2003 à 14:28:46
phosphorus68 a écrit : Raaah, ça me revient que maintenant! |
ouep j'ai déjà utilisé le prog uniq, très puissant combiné avec un sort .
Par contre je ne comprends pas tout à ton message. NF et NR ça veut dire koi?
et puis un autre pb c que ya des enregistrements derrière... donc à la limite avec cette technique je pourrai faire un entête correct, mais pas garder les enregistrements... à moins qu'il y ait quelque chose qui m'échappe
Marsh Posté le 29-04-2003 à 14:33:49
NF nombre de colonnes de la ligne en cours de traitement
NR n° de ligne qu'on est en train de traiter
Ce sont les 2 variables spécifiques à AWK les plus utilisées (il y en a d'autres)
Le uniq ct pour préparer une 1ère ligne avec toutes les colonnes possibles à partir des 1ères lignes des n fichiers, une sorte de pré-traitement.
Mais après (vaut mieux faire un script quitte à lancer plusieurs fois awk)) il faut encore remplir ce fichier de sortie avec certaines colonnes remplies et d'autres vides selon les fichiers d'entrée ... Bonjour l'utilisation des tableaux dans cette 2ème étape
Marsh Posté le 29-04-2003 à 14:36:30
phosphorus68 a écrit : NF nombre de colonnes de la ligne en cours de traitement |
ouep je v réfléchir à ça
mais je suis sur la bonne voie grâce à toi
Marsh Posté le 29-04-2003 à 12:30:53
Bon voilà, en gros j'ai 2 fichiers (en fait j'en ai bcp plus mais si je peux le faire avec 2 je peux le faire avec n) et je voudrais les concaténer par les colonnes.
sur la première ligne, c'est un entête avec les noms des colonnes. Sur les lignes suivantes il y a les enregistrements
avec un exemple ce sera plus compréhensible:
Fichier 1:
Date,Heure,Util,Mat,Action,Info,Rubrique,Machin } entête
là ya les enregistrements { ... ... ...
Fichier2:
Date,Heure,Util,Mat,Action,Info,Période,Bidule } entête
là ya les enregistrements { ... ... ...
Bon donc comme vous le voyez, on a des attributs communs aux deux fichiers (ici Date, Heure,Util,Mat,Action,Info) et d'autres spécifiques.
Le but c'est d'arriver à faire un seul et même fichier, par exemple:
FichierFinal:
Date,Heure,Util,Mat,Action,Info,Rubrique,Machin,Période,Bidule
et bien sûr les enregistrements en dessous dans le bon ordre
Avec un cat c pas la bonne solution puisqu'il ne fait pas des traitements sur les colonnes. J'ai pensé à la commande awk mais ça n'a pas donné grand chose
Voilà... si vous avez des idées, je suis preneur
Message édité par Yonel le 29-04-2003 à 14:32:34