comment puis-je comparer deux fichiers texte qui a plusieurs champs dans unix
j'ai deux fichiers texte
-
fichier 1
number,name,account id,vv,sfee,dac acc,TDID 7000,john,2,0,0,1,6 7001,elen,2,0,0,1,7 7002,sami,2,0,0,1,6 7003,mike,1,0,0,2,1 8001,nike,1,2,4,1,8 8002,paul,2,0,0,2,7
-
fichier 2
number,account id,dac acc,TDID 7000,2,1,6 7001,2,1,7 7002,2,1,6 7003,1,2,1
je veux comparer ces deux fichiers texte. si les quatre colonnes de fichier 2 est-il dans le fichier 1 et de l'égalité de moyens je souhaite de sortie, comme cette
7000,john,2,0,0,1,6
7001,elen,2,0,0,1,7
7002,sami,2,0,0,1,6
7003,mike,1,0,0,2,1
nawk -F"," 'NR==FNR {a[$1];next} ($1 in a)' file2.txt file1.txt
.. cela fonctionne bien pour la comparaison de deux colonne unique dans les deux fichiers. je veux comparer plusieurs colonnes. quelqu'un a une suggestion?
EDIT: a Partir de l'OP commentaires:
nawk -F"," 'NR==FNR {a[$1];next} ($1 in a)' file2.txt file1.txt
.. cela fonctionne bien pour la comparaison de deux colonne unique dans les deux fichiers. je veux comparer plusieurs colonnes. vous avez une suggestion?
- Qui langage de programmation comptez-vous utiliser?
- Unix. je l'ai mentionné avant de lui-même
- Unix n'est pas un langage de programmation.
- ok merci, je ne suis pas bon dans les langages de programmation. mais je suis à l'aide de sun solaris serveur
- La sortie que vous avez fourni ressemble exactement comme le fichier 1 (moins l'en-tête). Pouvez-vous donner l'exemple de lignes dans les fichiers d'entrée qui ne sera pas apparaître dans la sortie?
- j'ai édité ce que vous voulez. 8001,8002 n'est pas présent dans le fichier 2.
- Merci de considérer mon awk 1-liner ici --> stackoverflow.com/questions/3186215/... je serais très surpris si le Perl réponse vous donne de meilleures performances. Si vous exécutez ce contre les fichiers dans le go de la taille, la performance est très important. De Plus, c'est beaucoup plus lisible =)
- pour donner exactement ce que je veux. @pdehaan, merci pour votre contribution. Merci à tous ceux qui m'ont aidé à résoudre mon problème
Vous devez vous connecter pour publier un commentaire.
Ce awk one-liner qui fonctionne pour multi-colonne sur non triés fichiers:
awk -F, 'NR==FNR{a[$1,$2,$3,$4]++;next} (a[$1,$3,$6,$7])' file1.txt file2.txt
Dans l'ordre pour que cela fonctionne, il est impératif que le premier fichier utilisé pour l'entrée (file1.txt dans mon exemple) le fichier qui a seulement 4 champs comme suit:
file1.txt
file2.txt
De sortie
Sinon, vous pouvez également utiliser la syntaxe suivante qui correspond de plus près à celui dans votre question, mais n'est pas très lisible à mon humble avis
TxtSushi ressemble à ce que vous voulez. Il permet de travailler avec des fichiers CSV à l'aide de SQL.
Ce n'est pas un élégant one-liner, mais vous pourriez le faire avec perl.
chmod +x cmp_csv.pl
. Et enfin exécuter le script:./cmp_csv.pl file1 file2 > outfile
.)' ./cmp_csv.pl: line 5:
while(split/,/,<A>) {"alors que je suis en cours d'exécution du script, il affiche l'erreur je l'ai mentionné ci-dessusperl -v
Réponse rapide: Utilisation
cut
pour séparer les champs dont vous avez besoin etdiff
de comparer les résultats.cut
pour votre comparaison. Ou ai-je raté quelque chose?Pas vraiment testé, mais cela peut fonctionner:
(Bien sûr, cela suppose que les fichiers d'entrée sont triés).
Ce n'est ni efficace ni assez il faudra cependant faire le travail. Il n'est pas le plus efficace de mise en œuvre qu'il analyse fichier1 plusieurs fois mais il n'y pas de lire l'intégralité du fichier dans la RAM soit donc a certains avantages par rapport à la simple script approches.
Cela fonctionne comme suit
sed -n '2,$p' file1
envoie fichier1 STDOUT sans la ligne d'en-têteDans l'ordre pour que cela fonctionne, vous devez vous assurer que fichier2 est trié avant d'exécuter la commande.
Cours d'exécution par rapport à votre exemple de données a donné les résultats suivants
MODIFIER
Je prends note de vos commentaires, vous obtenez une erreur de tri. Si cette erreur se produit lors du tri fichier2 avant d'exécuter la commande pipeline ensuite, vous pouvez diviser le fichier, trier chaque partie, puis de chat entre eux.
Quelque chose comme ce serait le faire pour vous
Vous devrez peut-être modifier les variables passées à de si votre fichier n'est pas répartie uniformément sur toute la gamme des premiers chiffres.
Le logiciel de statistiques R gère le traitement de plusieurs tables csv vraiment facilement.
Voir Une Intro. pour R ou R pour les Débutants.