Domanda

Esiste un comando UNIX alla pari di

sort | uniq

per trovare intersezioni di stringhe o " outlier " ;.

Un'applicazione di esempio: ho un elenco di modelli html, alcuni di essi contengono una stringa {% load i18n%}, altri no. Voglio sapere quali file no.

modifica: grep -L risolve il problema precedente.

Che ne dici di questo:

file1:

mom
dad
bob

file2:

dad

% intersect file1 file2

mom
bob

% left-unique file1 file2

<*>
È stato utile?

Soluzione

Sembra che grep -L risolva il vero problema del poster, ma per l'effettiva domanda posta, trovando l'intersezione di due serie di stringhe, potresti voler esaminare la " comm " ; comando. Ad esempio, se file1 e file2 contengono ciascuno un elenco ordinato di parole, una parola per riga, quindi

$ comm -12 file1 file2

produrrà le parole comuni ad entrambi i file. Più in generale, dati i file di input ordinati file1 e file2 , il comando

$ comm file1 file2

produce tre colonne di output

  1. righe solo nel file1
  2. righe solo in file2
  3. righe sia in file1 che in file2

Puoi sopprimere la colonna N nell'output con l'opzione -N . Quindi, il comando sopra, comm -12 file1 file2 , elimina le colonne 1 e 2, lasciando solo le parole comuni a entrambi i file.

Altri suggerimenti

Intersezione:

# sort file1 file2 | uniq -d
dad

Sinistra unica:

# sort file1 file2 | uniq -u
bob
mom

Forse sto fraintendendo la domanda, ma perché non usare semplicemente grep per cercare la stringa (usa l'opzione -L per far stampare i nomi dei file che non contengono la stringa).

In altre parole

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

o con caratteri jolly per i nomi dei file, a seconda dei casi.

Da http://www.commandlinefu.com/commands / view / 5710 / intersezione tra-due-files :

Intersezione tra due file (non ordinati):

grep -Fx -f file1 file2

Linee nel file2 che non sono nel file1:

grep -Fxv -f file1 file2

Spiegazione:

  • L'opzione -f dice a grep di leggere i pattern da cercare da un file. Ciò significa che esegue una ricerca di file2 per ogni riga in file1.
  • L'opzione -F dice a grep di vedere i termini di ricerca come stringhe fisse e non come pattern, quindi ac corrisponderà solo a ac e non abc ,
  • L'opzione -x dice a grep di fare ricerche su intere linee, in modo che " pippo " nel file1 non corrisponderà a " foobar " nel file2.
  • Di default, grep mostrerà solo le linee corrispondenti, dandoti l'intersezione. L'opzione -v dice a grep di mostrare solo linee non corrispondenti , dandoti le linee che sono uniche per file2.

da man grep

-L, --files-without-match
  

Sopprime l'output normale; invece stampa   il nome di ciascun file di input da cui   nessun output sarebbe stato normalmente   stampato. La scansione si interromperà   la prima partita.

Quindi, se i tuoi modelli sono file .html che vuoi:

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

Intersezione:

comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

Tutte le linee per 3 colonne (file1 | file2 | intersezione):

comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

Se i tuoi file non sono ordinati e / o se potrebbero esserci delle righe duplicate all'interno di uno dei file ma non visualizzate nell'altro - questo comando a una riga ordinerà i tuoi file, rimuoverà le righe duplicate e otterrai direttamente il risultato desiderato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top