2009-06-19 45 views
16

¿Existe un comando de UNIX a la par conComando Unix para encontrar cadenas de intersecciones o valores atípicos?

sort | uniq 

para encontrar las intersecciones juego de cuerdas o "atípicos".

Una aplicación de ejemplo: Tengo una lista de plantillas html, algunas de ellas tienen cadena% {% load i18n%} dentro, otras no. Quiero saber qué archivos no.

editar: grep -L soluciona el problema anterior.

¿Qué tal esto:

fichero1:

mom 
dad 
bob 

fichero2:

dad 

% intersectar archivo1 archivo2

dad 

% de izquierda única archivo1 archivo2

mom 
bob 

Respuesta

28

Parece que grep -L soluciona el verdadero problema del cartel, pero para la pregunta real preguntado, al encontrar la intersección de dos conjuntos de cadenas, es posible que desee examinar el comando "comm". Por ejemplo, si file1 y file2 cada uno contiene una lista ordenada de palabras, una palabra por línea, a continuación,

$ comm -12 file1 file2 

producirá las palabras comunes a ambos archivos.De manera más general, los archivos de entrada ordenados dado file1 y file2, el comando

$ comm file1 file2 

produce tres columnas de salida

  1. líneas sólo en fichero1
  2. líneas sólo en file2
  3. líneas en tanto archivo1 y archivo2

Puede suprimir la columna N en la salida con la opción -N. Por lo tanto, el comando anterior, comm -12 file1 file2, suprime las columnas 1 y 2, dejando solo las palabras comunes a ambos archivos.

+2

No olvide ejecutar sus archivos por orden antes de la comparación. Lo hice, y los resultados me enviaron a una loca búsqueda. –

+1

Menciono arriba que cada archivo contiene una "lista ordenada de palabras", pero puede que no salte directamente hacia usted. –

5

Tal vez estoy malinterpretando la pregunta, pero ¿por qué no usar grep para buscar la cadena (use la opción -L para que imprima los nombres de los archivos que no tienen la cadena en ellos) .

En otras palabras

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

o con comodines para los nombres de archivo según corresponda.

+0

gracias, hombre! funciona. – Evgeny

+1

Para una búsqueda más rápida, usaría -F también, ya que es solo una cadena fija. –

+0

¿qué hay de establecer intersecciones? – Evgeny

2

de hombre grep

-L, --files-without-match 

suprimir la salida normal; en su lugar, imprima el nombre de cada archivo de entrada del que no se imprimirá normalmente ninguna salida . El escaneo se detendrá en en la primera coincidencia.

Así que si las plantillas son archivos .html que desea:

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

Intersección:

única
# sort file1 file2 | uniq -d 
dad 

Izquierda:

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

La intersección funciona, pero la dejó única no. Muestra los valores únicos en todo el conjunto, no los únicos en el primer conjunto. –

2

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

Intersección entre dos archivos (sin clasificar):

grep -Fx -f file1 file2 

Líneas en fichero2 que no están en archivo1:

grep -Fxv -f file1 file2 

Explicación:

  • ElLa opciónle dice a grep que lea los patrones que debe buscar desde un archivo. Eso significa que realiza una búsqueda de file2 para cada línea en file1.
  • opción
  • El -F dice a grep para ver los términos de búsqueda como cadenas fijas, y no como patrones, para que a.c sólo igualará a.c y no abc,
  • El -x opción le dice a grep para hacer búsquedas de toda la línea, por lo que " foo "en el archivo 1 no coincidirá con" foobar "en el archivo2.
  • Por defecto, grep mostrará solo las líneas correspondientes, que le dan la intersección. La opción -v le dice a grep que solo muestre las líneas que no coinciden, que le proporcionan las líneas exclusivas de file2.
Cuestiones relacionadas