#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