2012-08-15 18 views

Respuesta

5

Creo que este artículo te será útil: Set Operations in the Unix Shell. En particular, la operación de complemento del conjunto es lo que estás pidiendo.

+1

hay un error en este artículo comm no funciona correctamente con sort -n, por ejemplo: comm <(sort -n <<< 4 $ '\ n'55 $' \ n'7) <(ordenar -n <<< 2 $ '\ n'55 $' \ n'8) –

+1

Esta es una respuesta de solo enlace. – YSC

7
comm -23 <(command_which_generate_N|sort) <(command_which_generate_M|sort) 

comm sin pantalla opción de 3 columnas de salida: 1: sólo en el primer archivo, 2: Sólo en segundo archivo, 3: en ambos archivos. -23 elimina la segunda y tercera columnas.

Los archivos de entrada deben estar ordenados.

GNU clasificar y comunicación depende de la configuración regional, por ejemplo, orden de salida puede ser diferente (pero el contenido debe ser la misma)

(export LC_ALL=C; comm -23 <(command_which_generate_N|sort) <(command_which_generate_M|sort)) 
1

I wrote a program recently called Setdown que no operaciones de conjuntos (como diferencia de conjuntos) desde la CLI.

Se pueden realizar operaciones con el conjunto escribiendo una definición similar a lo que se escriba en un Makefile:

someUnion: "file-1.txt" \/ "file-2.txt" 
someIntersection: "file-1.txt" /\ "file-2.txt" 
someDifference: someUnion - someIntersection 

Es bastante fresco y usted debe comprobar que funciona. Personalmente, no recomiendo la publicación "set operations in Unix shell". No funcionará bien cuando realmente necesite realizar muchas operaciones de conjunto o si tiene operaciones establecidas que dependan entre sí.

En cualquier caso, creo que es genial y deberías comprobarlo por completo.

+0

El sitio parece estar fuera de servicio. ¿Hay una nueva URL? – escitalopram

+0

Aquí hay un enlace directo a la fuente: https://bitbucket.org/robertmassaioli/setdown –

1

uniq -u (manpage) a menudo es la herramienta más simple para la lista de la resta:

Uso

uniq [OPTION]... [INPUT [OUTPUT]] 
[...] 
-u, --unique 
    only print unique lines 

Ejemplo: los archivos de lista que se encuentran en el directorio, pero no en b

$ ls a 
file1 file2 file3 
$ ls b 
file1 file3 

$ echo "$(ls a ; ls b)" | sort | uniq -u 
file2 
+0

Esta es la diferencia simétrica, no el complemento relativo. Cualquier elemento único en B también estará en el resultado. Sin embargo, si no hay elementos en B que no estén en A, entonces esto funciona bien. – Brent

+0

Para hacer eco en @Brent esto técnicamente no se establece la resta. Esta es la diferencia simétrica entre dos conjuntos. Encuentra todos los archivos en solo UNO de los dos directorios 'a' y' b'. – Hunle