[ksh]Correspondance entre 2 fichiers

Correspondance entre 2 fichiers [ksh] - Shell/Batch - Programmation

Marsh Posté le 25-03-2009 à 23:27:38    

Bonjour,
 
J'ai un fichier .csv (un fichier texte séparé par des ";" en gros) qui a cette forme :
 
nom_job;lien_sort;id_col_sort;nom_col_sort
 
et un autre contenant :
 
id_table;nom_lien;nom_job
 
Et je voudrais obtenir l'id de la table à laquelle appartient chaque colonne (avec nom_job=nom_job et lien_sort=nom_lien), donc le fichier :
 
 
nom_job;lien_sort;id_col_sort;id_table;nom_col_sort
 
 
Je peux faire ça avec awk ? Comment ?

Reply

Marsh Posté le 25-03-2009 à 23:27:38   

Reply

Marsh Posté le 25-03-2009 à 23:32:37    

Me semble que "join" permet de faire ça. À vérifier avec "man join".

Reply

Marsh Posté le 25-03-2009 à 23:42:19    

Ah oui effectivement, merci!!

Reply

Marsh Posté le 26-03-2009 à 12:51:17    

Elmoricq a écrit :

Me semble que "join" permet de faire ça. À vérifier avec "man join".


 
 
J'ai donc essayé cette commande :
 
Format du fichier depart.csv :
 
nom_projet;nom_job;lien_sort;id_col_sort;nom_col_sort
 
Format du fichier sortie.csv :
 
nom_projet;nom_job;nom_lien;id_table
 
# Trie les fichiers
sort -t ';' -k 2,3 sortie.csv > sortsortie.csv
sort -t ';' -k 2,3 depart.csv > sortdepart.csv
 
join -1 2,3 -2 2,3 -t ';' -o "1.1 1.2 1.3 1.4 1.5 2.4" sortdepart.csv sortsortie.csv > arrsortie.csv
 
Pour essayer d'avoir en sortie le meme fichier que depart.csv mais avec l'id correspondant pour chaque nom_job et nom_lien
 
Après la commande j'ai vérifié et j'obtiens un fichier arrsortie.csv de 101891 lignes alors que depart.csv n'en contient que 23411
 
Quelqu'un sait pourquoi?

Reply

Marsh Posté le 26-03-2009 à 13:23:35    

Les lignes supplémentaires ne seraient-elles pas les lignes sans correspondance entre les deux fichiers ?

Reply

Marsh Posté le 26-03-2009 à 19:33:10    

Non, chaque ligne du 1er fichier a une correspondance dans le 2eme, par contre j'ai fais "join -1 2,3 -2 2,3" pour joindre par rapport aux champs 2 et 3 mais je ne sais pas si c'est possible ça vient surement de la parce que j'ai testé en concatenant ces deux champs, en rajoutant cet colonne et en faisant le join sur cette colonne ça fonctionne.
Si quelqu'un a une autre solution plus "propre" ça serait cool!

Reply

Marsh Posté le 29-03-2009 à 15:43:47    

up

Reply

Marsh Posté le 07-04-2009 à 10:48:12    

stagebi a écrit :

... Je peux faire ça avec awk ? Comment ?


 
Oui.
En montant ton fichier des tables dans un tableau.
 
Par exemple :
 
<fichier_table>
idtab1;lien1;job1
idtab2;lien2;job2
 
<fichier_cols>
job1;lien1;col1;colonne n°1
job1;lien1;col2;colonne n°2
job1;lien1;col3;colonne n°3
job2;lien2;col1;colonne n°1
job3;lien3;col1;test vide
 
Commande awk :

Code :
  1. awk -F';' -v FICTAB=./fichier_table '\
  2. BEGIN {
  3. OFS = FS
  4. while ((getline < FICTAB) > 0)
  5. {
  6.   cle=$3"#"$2
  7.   ARRAY_KEYS[cle]=1
  8.   ARRAY_ID[cle]=$1
  9. }
  10. }
  11. {
  12. testcle=$1"#"$2
  13. IDTABLE=""
  14. if ( testcle in ARRAY_KEYS ) { IDTABLE=ARRAY_ID[testcle] }
  15. print $1 FS $2 FS $3 FS IDTABLE FS $4
  16. }' ./fichier_cols > ./fichier.out


 
Résultat :
 
<fichier.out>
job1;lien1;col1;idtab1;colonne n°1
job1;lien1;col2;idtab1;colonne n°2
job1;lien1;col3;idtab1;colonne n°3
job2;lien2;col1;idtab2;colonne n°1
job3;lien3;col1;;test vide
 
 
Dans cet exemple, si on ne trouve pas de référence, on met NULL dans la colonne en sortie id_table


---------------
Il n'est qu'une seule chose qui excite les animaux plus que le plaisir, et c'est la douleur.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed