2012-08-15 14 views

risposta

5

Credo che questo articolo sarà utile per voi: Set Operations in the Unix Shell. In particolare, l'operazione del complemento del set è ciò che stai chiedendo.

+1

c'è un errore in questo articolo comm non funziona correttamente con sort -n, ad esempio: comm <(sort -n <<< 4 $ '\ n'55 $' \ n'7) <(sort -n <<< 2 $ '\ n'55 $' \ n'8) –

+1

Questa è una risposta solo per collegamento. – YSC

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

comm senza display opzione 3 colonne di uscita: 1: solo in primo file, 2: solo nel secondo file, 3: in entrambi i file. -23 rimuove la seconda e la terza colonna.

I file di input devono essere ordinati.

GNU ordinamento e comunicatore dipende locale, ad esempio dell'ordine di uscita possono essere diversi (ma contenuto deve essere lo stesso)

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

I wrote a program recently called Setdown che non operazioni (ad esempio come differenza set) dalla CLI.

E 'possibile eseguire le operazioni di set scrivendo una definizione simile a quello che si può scrivere in un Makefile:

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

La sua piuttosto fresco e si dovrebbe check it out. Personalmente non consiglio il post "imposta le operazioni in unix shell". Non funzionerà bene quando hai davvero bisogno di fare molte operazioni di set o se hai delle operazioni che dipendono l'una dall'altra.

In ogni caso, penso che sia abbastanza bello e dovresti assolutamente verificarlo.

+0

Il sito sembra essere inattivo. C'è un nuovo URL? – escitalopram

+0

Ecco un link direttamente alla fonte: https://bitbucket.org/robertmassaioli/setdown –

1

uniq -u (manpage) è spesso lo strumento più semplice per la lista sottrazione:

Uso

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

Esempio: file di elenco si trovano in directory un ma non in b

$ ls a 
file1 file2 file3 
$ ls b 
file1 file3 

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

Questa è la differenza simmetrica, non il relativo complemento. Anche gli elementi unici in B saranno nel risultato. Tuttavia, se non ci sono elementi in B che non sono in A, allora funziona bene. – Brent

+0

Per echo @Brent questo non è tecnicamente impostato sottrazione. Questa è la differenza simmetrica tra due set. Trova tutti i file solo in UNA delle due directory 'a' e' b'. – Hunle