Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/04/2009, à 16:14

J-dub

Différence entre deux fichiers selon plusieurs colonnes

Bonjour,

J'ai deux fichiers .csv séparés par des | contenant ces infos :

nom_projet|nom_job|lien_sortie|id_col_sortie|nom_col_sortie|type|taille|derivation|lien_entree|id_col_entree|nom_col_entree

Exemple :

Fichier 1 :

projet1|job1|lien_sort1|1|col_sort1|1|1|derivation1|lien_entr1|2|col_entr1

projet1|job1|lien_sort1|3|col_sort2|1|1|derivation2|lien_entr2|4|col_entr2

projet1|job1|lien_sort1|5|col_sort3|1|1|derivation3|lien_entr3|6|col_entr3

projet1|job1|lien_sort2|7|col_sort4|1|1|derivation4|lien_entr4|8|col_entr4

projet1|job1|lien_sort2|9|col_sort5|1|1|derivation5|lien_entr5|10|col_entr5

projet1|job1|lien_sort2|11|col_sort6|1|1|derivation6|lien_entr6|12|col_entr6

projet1|job1|lien_sort2|13|col_sort7|1|1|derivation7|lien_entr7|14|col_entr7

Fichier 2 :

projet1|job1|lien_sort1|1|col_sort1|1|1|derivation15|lien_entr18|46|col_entr21

projet1|job1|lien_sort1|5|col_sort3|1|1|derivation12|lien_entr33|48|col_entr52

projet1|job1|lien_sort2|7|col_sort4|1|1|derivation59|lien_entr12|56|col_entr12

projet1|job1|lien_sort2|9|col_sort5|1|1|derivation72|lien_entr96|28|col_entr16

Je souhaiterai à partir de ces deux fichiers (en faisant le lien pour que nom_job, lien_sortie et nom_col_sortie soit identique) obtenir en sortie un seul fichier dans lequel je retrouverai les infos du fichier 2 si elles sont présentes, sinon celle du fichier 1

Pour cet exemple cela donnerai :

projet1|job1|lien_sort1|1|col_sort1|1|1|derivation15|lien_entr18|46|col_entr21

projet1|job1|lien_sort1|3|col_sort2|1|1|derivation2|lien_entr2|4|col_entr2

projet1|job1|lien_sort1|5|col_sort3|1|1|derivation12|lien_entr33|48|col_entr52

projet1|job1|lien_sort2|7|col_sort4|1|1|derivation59|lien_entr12|56|col_entr12

projet1|job1|lien_sort2|9|col_sort5|1|1|derivation72|lien_entr96|28|col_entr16

projet1|job1|lien_sort2|11|col_sort6|1|1|derivation6|lien_entr6|12|col_entr6

projet1|job1|lien_sort2|13|col_sort7|1|1|derivation7|lien_entr7|14|col_entr7

J'ai testé en faisant un "join" sur la concaténation de ces trois colonnes mais déjà je ne pense pas que ce soit une bonne façon de faire (je ne sais pas comment faire un join sur plusieurs colonnes) et en plus ça ne fonctionne pas car dans le join les 4 dernières colonnes sont soit dans le fichier 1 soit dans le 2.

Donc ces commandes (concaténation, trie et join) :

cat fichier1.csv | awk 'BEGIN{FS=OFS="|" } { if($3 != "") { id = $2 "." $3 "." $4 } else { id = "" } ; $11 = $11 OFS id ; t = $12 ; print }' > j1fichier1.csv

cat fichier2.csv | awk 'BEGIN{FS=OFS="|" } { if($3 != "") { id = $2 "." $3 "." $4 } else { id = "" } ; $11 = $11 OFS id ; t = $12 ; print }' > j2fichier2.csv

  

sort -t '|' -k 12 j1fichier1.csv > sortj1fichier1.csv

sort -t '|' -k 12 j2fichier2.csv > sortj2fichier2.csv

 

join -a 1 -1 12 -2 12 -t '|' -o "1.1 1.2 1.3 1.4 1.5 1.6 1.7 2.8 2.9 2.10 2.11" sortj1fichier1.csv sortj2fichier2.csv > resultat.csv

Donnent ce résultat :

projet1|job1|lien_sort1|1|col_sort1|1|1|derivation15|lien_entr18|46|col_entr21

projet1|job1|lien_sort1|3|col_sort2|1|1||||

projet1|job1|lien_sort1|5|col_sort3|1|1|derivation12|lien_entr33|48|col_entr52

projet1|job1|lien_sort2|11|col_sort6|1|1||||

projet1|job1|lien_sort2|13|col_sort7|1|1||||

projet1|job1|lien_sort2|7|col_sort4|1|1|derivation59|lien_entr12|56|col_entr12

projet1|job1|lien_sort2|9|col_sort5|1|1|derivation72|lien_entr96|28|col_entr16

Comment faire ça autrement pour obtenir ce que je souhaite ?

#2 Le 15/04/2009, à 16:58

Alain.g

Re : Différence entre deux fichiers selon plusieurs colonnes

Ceci devrait fonctionner :

awk -F'|' '!a[$2$3$4]++' fichier2.csv fichier1.csv

attention à bien mettre fichier2 avant fichier1


Xubuntu Karmic !

Hors ligne