2012-08-15 13 views
6

Wie subtrahiert man einen Satz von einem anderen in Bash?Bash Set Subtraktion

Dies ist ähnlich: Is there a "set" data structure in bash? aber verschieden, wie es fragt, wie die Subtraktion durchzuführen, mit dem Code

  • set1: N Zeilen als Ausgang durch einen Filter
  • set2: M Zeilen als Ausgang durch einen Filter

wie zu bekommen:

  • set3: mit allen Linien in N, die ich nicht angezeigt n M

Antwort

5

Ich glaube, dieser Artikel wird Ihnen nützlich sein: Set Operations in the Unix Shell. Insbesondere ist die Satzkomplement-Operation das, wonach Sie fragen.

+1

gibt es Ein Fehler in diesem Artikel funktioniert nicht korrekt mit dem Befehl sort -n, zum Beispiel: comm <(sort -n <<< 4 $ '\ n'55 $' \ n'7) <(sort -n <<< 2 $ '\ n'55 $' \ n'8) –

+1

Dies ist eine Nur-Link-Antwort. – YSC

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

comm ohne Option Anzeige 3 Spalten der Ausgabe: 1: nur in der ersten Datei, 2: nur in der zweiten Datei, 3: in beiden Dateien. -23 entfernt die zweite und dritte Spalte.

Eingabedateien müssen sortiert sein.

GNU Art und comm hängt von locale, beispielsweise Ausgabereihenfolge unterschiedlich sein kann (aber Inhalt muss gleich sein)

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

I wrote a program recently called Setdown, die Operationen nicht Set (wie Einstelldifferenzdruck) aus dem cli.

Es kann Set-Operationen durchführen, indem eine Definition ähnlich zu schreiben, was Sie in einem Makefile schreiben würde:

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

Es ist ziemlich kühl, und Sie sollten es ausprobieren. Ich persönlich empfehle den Post "set operations in unix shell" nicht. Es wird nicht gut funktionieren, wenn Sie wirklich viele Set-Operationen durchführen müssen oder wenn Sie Set-Operationen haben, die voneinander abhängen.

Auf jeden Fall denke ich, dass es ziemlich cool ist und Sie sollten es total überprüfen.

+0

Die Website scheint nicht verfügbar zu sein. Gibt es eine neue URL? – escitalopram

+0

Hier ist ein Link direkt zur Quelle: https://bitbucket.org/robertmassaioli/setdown –

1

uniq -u (manpage) ist oft das einfachste Werkzeug für die Liste Subtraktion:

Nutzungs

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

Beispiel: Liste Dateien im Verzeichnis a gefunden, aber nicht in b

$ ls a 
file1 file2 file3 
$ ls b 
file1 file3 

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

Dies ist der symmetrische Unterschied, nicht das relative Komplement. Alle eindeutigen Elemente in B werden ebenfalls im Ergebnis enthalten sein. Wenn jedoch in B keine Elemente vorhanden sind, die nicht in A enthalten sind, funktioniert dies gut. – Brent

+0

Zum Echo @Brent ist dies technisch keine Subtraktion. Dies ist der symmetrische Unterschied zwischen zwei Sätzen. Es findet alle Dateien in nur einem der beiden Verzeichnisse "a" und "b". – Hunle