2014-06-11 4 views
0

Je ces fichiers à savoir test1.csv qui a des données commeComment comparer ces deux fichiers dans unix

Paris 
London 
New York 
Brisbane 

et test2.csv qui a les mêmes données, mais un ordre différent

London 
Paris 
Brisbane 
New York 

I » m en comparant ces 2 fichiers et s'ils sont égaux je mets à jour un drapeau. Mais comment comparer ces 2 fichiers.?

EDIT: Si le fichier contient des données numériques comme

0025 
0013 
0566 

approche à suivre pour ce tri dans l'ordre croissant.?

+0

Il n'est pas clair si votre question est de savoir comment trier ou comment comparer. Si c'est une comparaison, pourquoi est-ce important de trier par ordre croissant ou décroissant? –

+0

Si vous avez '0025' dans un fichier et' 25' dans un autre fichier - devraient-ils être considérés comme identiques ou non? Que voulez-vous que le résultat de la comparaison soit - un booléen ou un nombre de lignes différent ou une liste des différences ou quelque chose d'autre? –

+0

Salut Ed désolé pour la réponse tardive, nous obtiendrons toujours la même valeur dans les deux fichiers en fait, donc si c'est 0025 dans le premier fichier, il sera le même dans le deuxième fichier, mais l'ordre peut être différent. :) – user2647888

Répondre

5

Trier ensuite les fichiers diff:

diff <(sort test1.csv) <(sort test2.csv) 
+1

Salut si c'est un fichier numérique basé sur 0012,0013,0045 puis-je utiliser trier? – user2647888

+0

@ user2647888: oui, vous pouvez utiliser 'sort' indépendamment de ce que contiennent les fichiers (tant qu'il est vaguement textuel, donc il y a un nombre raisonnable de sauts de ligne, il est inutile de trier un fichier JSON 1 ligne, même si c'est 10 GiB). Ce qui compte, c'est que les mêmes critères de tri soient utilisés sur les deux fichiers, de sorte que les entrées liées seront triées dans la même séquence. –

1

Vous pouvez d'abord trier les fichiers et de les comparer:

sort file1.csv 

Cependant, l'approche ci-dessus trie une ligne de fichiers en ligne. Si votre contenu est sur une ligne (par exemple, il existe des valeurs numériques séparées par des virgules sur une ligne), vous pouvez les placer dans des lignes distinctes en premier. Par exemple:

cat > file1 $ `0025, 0013, 0566` 

cat > file2 $ `0013, 0025, 0566` 

et vous essayez de les trier, il ne fonctionnera pas:

sort file1 : $ `0025, 0013, 0566` 

sort file2 : $ `0013, 0025, 0566` 

Dans ce cas, d'une manière est de remplacer la virgule (et l'espace après la virgule) avec une nouvelle ligne first:

sed 's/, /\ 
/g' file1 

puis de trier le résultat (puis de comparer).

Voici le fichier bash que j'ai écrit:

#!/bin/bash 

clear 

sed 's/, /\ 
/g' file1 > file1_formatted 

sed 's/, /\ 
/g' file2 > file2_formatted 

sort file1_formatted > file1_sorted 
sort file2_formatted > file2_sorted 

comm -3 file1_sorted file2_sorted 
1

Vous pouvez utiliser diff, ou vous pouvez utiliser comm sur les fichiers triés. En supposant que vous avez Bash avec process substitution, puis:

comm <(sort test1.csv) <(sort test2.csv) 

Cela liste les lignes que dans le fichier 1 sans retrait, ceux que dans le fichier 2 par un onglet en retrait, et ceux dans les deux par deux onglets indentées. Vous pouvez contrôler quelles «colonnes» sont affichées en supprimant celles que vous ne voulez pas. Par exemple, pour afficher uniquement les lignes qui sont dans un seul fichier, mais pas l'autre, utilisez -3 pour supprimer la troisième colonne:

comm -3 <(sort test1.csv) <(sort test2.csv) 

Pour afficher uniquement les lignes trouvées dans les deux fichiers (les lignes communes), supprimer la colonne 1 et 2 avec:

comm -12 <(sort test1.csv) <(sort test2.csv) 
+0

Salut, si c'est une donnée numérique que j'ai posté. – user2647888

+0

@ user2647888: Voir mon autre [commentaire] (http://stackoverflow.com/questions/24167957/how-to-compare-these-two-files-in-unix/24168142#comment37301817_24167985). Aucun problème. –

+0

Etes-vous sûr qu'il n'y a pas de problème? J'ai l'impression de me rappeler que 'comm' se plaint de certains fichiers triés numériquement puisque' comm' n'a pas tous les cloches que 'sort' fait pour spécifier l'ordre de tri afin que vous sachiez que vous avez trié les fichiers comme vous le vouliez mais' comm' n'est pas d'accord que cette commande est 'triée'. –