2014-09-16 3 views
6

J'ai deux fichiers CSV, je veux les joindre en utilisant une valeur de clé, la colonne de la ville.joindre deux fichiers CSV avec la valeur de clé

Un fichier csv, d01.csv a cette forme,

Barcelona, 19.5, 29.5 
Tarragona, 20.4, 31.5 
Girona, 17.2, 32.5 
Lleida, 16.5, 33.5 
Vic, 17.5, 31.4 

L'autre, d02.csv, a la structure suivante,

City, Data, TMax, TMin 
Barcelona, 20140916, 19.9, 28.5 
Tarragona, 20140916, 21.4, 30.5 
Lleida, 20140916, 17.5, 32.5 
Tortosa, 20140916, 20.5, 30.4 

je besoin d'un nouveau fichier csv, avec une colonne de villes qui apparaissent dans les 2 fichiers csv.

City, Tmin, Tmax, Date, Tmin1, Tmax1 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Tarragona, 20.4, 31.5, 20140916, 21.4, 30.5 
Girona, 17.2, 32.5, 20140916, 17.5, 32.5 
Lleida, 16.5, 33.5, 20140916, 20.5, 30.4 

J'ai essayé de le faire avec

join -j 2 -t ',' d01.csv d02.csv | awk -F "," '{print $1, $2, $3, $4, $5} > d03.csv 

mais il est pas terminée ... Comment puis-je commander la valeur de clé?

+0

ces chiffres sont de premier plan dans le réel des dossiers? Quelle est la sortie de cette commande de jointure? Essayez-vous vraiment d'inverser l'ordre des colonnes 'Tmin' et' Tmax' dans le cadre de ce processus? Est-ce que 'd01.csv' n'a vraiment pas de ligne de tête? Les valeurs 'Tmax' sont-elles censées être inférieures aux valeurs' Tmin' dans les fichiers d'entrée? –

+1

@Jotne Je n'ai pas fait cette édition parce que je n'étais pas certain que ces virgules dans le premier fichier étaient une erreur. L'OP utilisait '-j 2' dans la commande' join' après tout. –

+0

OP Si la modification est incorrecte, corrigez-la. – Jotne

Répondre

6

Voici comment utiliser se joindre à bash:

{ 
    echo "City, Tmin, Tmax, Date, Tmin1, Tmax1" 
    join -t, <(sort d01.csv) <(sed 1d d02.csv | sort) 
} > d03.csv 
cat d03.csv 
City, Tmin, Tmax, Date, Tmin1, Tmax1 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 

Notez que joindre ne transmet que les enregistrements où la clé existe dans les deux fichiers. Pour obtenir tous, précisez que vous voulez des documents manquants des deux fichiers, spécifiez les champs que vous souhaitez, et donner une valeur par défaut pour les champs manquants:

join -t, -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4 -e '?' <(sort d01.csv) <(sed 1d d02.csv | sort) 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Girona, 17.2, 32.5,?,?,? 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 
Tortosa,?,?, 20140916, 20.5, 30.4 
Vic, 17.5, 31.4,?,?,? 
+0

Merci pour les commandes et commenter –

+0

Epic morceau de script, merci! Dans mon cas, il a semblé ajouter quelques retours chariot (qui apparaissent dans vi en tant que^M), mais cela pourrait être lié à mes données source.La commande rapide vi suivante trie cela: ':% s/\ r // g' – Tom

+0

Cette commande n'aurait pas ajouté de retour chariot, ils proviendraient de vos fichiers d'entrée. –

0

Ce awk peut faire:

awk 'FNR==NR {a[$1]=$2FS$3FS$4;next} $1 in a {print $0,a[$1]}' OFS=", " d02,csv d01csv 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
+0

il fonctionne aussi, mais pourriez-vous m'expliquer cette structure? Je vais l'apprécier –

+0

@EnricAgudPique 'FNR == NR' lancer ceci pour le premier fichier' d02.csv' (stocker les données du fichier dans un tableau 'a' en utilisant le premier champ comme index.) Si le premier champ est trouvé dans le fichier suivant '$ 1 dans un' imprimer la sortie nécessaire.C'est une façon courante de gérer deux fichiers dans 'awk' – Jotne

+0

Merci pour votre aide –

Questions connexes