2009-06-19 7 views
16

Y at-il une commande UNIX sur le pair avecCommande Unix pour trouver des intersections d'ensembles de chaînes ou des valeurs aberrantes?

sort | uniq 

pour trouver des intersections de jeu de chaîne ou « valeurs aberrantes ».

Un exemple d'application: J'ai une liste de modèles html, certains d'entre eux ont {% load i18n%} chaîne à l'intérieur, d'autres non. Je veux savoir quels fichiers ne le font pas.

modifier: grep -L résout le problème ci-dessus.

Que diriez-vous ceci:

fichier1:

mom 
dad 
bob 

fichier2:

dad 

% recouper fichier1 fichier2

dad 

% à gauche unique fichier1 fichier2

mom 
bob 

Répondre

28

Il semble que le vrai grep -L résout problème de l'affiche, mais pour la question réelle demandé, trouver l'intersection de deux ensembles de chaînes, vous pourriez vouloir regarder dans la commande "comm". Par exemple, si file1 et file2 contiennent chacun une liste triée des mots, un mot par ligne, puis

$ comm -12 file1 file2 

produira les mots communs aux deux fichiers.De manière plus générale, les fichiers d'entrée triés donné file1 et file2, la commande

$ comm file1 file2 

produit trois colonnes de sortie

  1. lignes seulement dans fichier1
  2. lignes seulement dans fichier2
  3. lignes dans les deux fichier1 et file2

Vous pouvez supprimer la colonne N dans la sortie avec l'option -N. Ainsi, la commande ci-dessus, comm -12 file1 file2, supprime les colonnes 1 et 2, ne laissant que les mots communs aux deux fichiers.

+2

N'oubliez pas d'exécuter vos fichiers par tri avant la comparaison. Je l'ai fait, et les résultats m'ont envoyé sur une chasse aux oies sauvage. –

+1

Je mentionne ci-dessus que chaque fichier contient une "liste de mots triés", mais elle ne vous saute pas aux yeux. –

5

Peut-être que je suis mal compris la question, mais pourquoi ne pas simplement utiliser grep pour rechercher la chaîne (utilisez l'option -L pour avoir imprimer les noms des fichiers qui n'ont pas la chaîne en eux) .

En d'autres termes

grep -L "{% load i18n %}" file1 file2 file3 ... etc 

ou avec des caractères génériques pour les noms de fichiers, selon le cas.

+0

merci, mec! Ça marche. – Evgeny

+1

Pour une recherche plus rapide, j'utiliserais aussi -F, puisque c'est juste une chaîne fixe. –

+0

qu'en est-il des intersections définies? – Evgeny

2

de l'homme grep

-L, --files-without-match 

sortie normale Suppress; à la place d'imprimer le nom de chaque fichier d'entrée à partir de laquelle aucune sortie aurait normalement été imprimé. Le balayage s'arrêtera le le premier match.

Donc, si vos modèles sont des fichiers .html vous voulez:

grep -L '{% load i18n %}' *.html 
7

Intersection:

# sort file1 file2 | uniq -d 
dad 

Gauche unique:

# sort file1 file2 | uniq -u 
bob 
mom 
+0

L'intersection fonctionne, mais à gauche unique ne fonctionne pas. Il montre les valeurs uniques dans l'ensemble de l'ensemble, et non uniquement celles du premier. –

2

De http://www.commandlinefu.com/commands/view/5710/intersection-between-two-files:

intersection entre deux fichiers (non triés):

grep -Fx -f file1 file2 

Lines fichier2 qui ne sont pas fichier1:

grep -Fxv -f file1 file2 

Explication:

  • Le -f option indique à grep de lire les modèles à rechercher à partir d'un fichier. Cela signifie qu'il effectue une recherche de fichier2 pour chaque ligne de fichier1.
  • L'option -F dit grep pour voir les termes de recherche sous forme de chaînes fixes, et non pas comme des modèles, de sorte que a.c ne correspondra a.c et non abc,
  • L'option -x indique grep pour effectuer des recherches en ligne ensemble, de sorte que " foo "dans fichier1 ne correspondra pas" foobar "dans fichier2.
  • Par défaut, grep affichera uniquement les lignes correspondantes, vous donnant l'intersection. L'option -v indique à grep d'afficher uniquement les lignes qui ne correspondent pas, ce qui vous donne les lignes uniques à file2.
Questions connexes