Ich versuche, ein einfaches Skript zu schreiben, das den Inhalt in zwei Listen auflistet. Verwenden wir zur Vereinfachung ls als Beispiel. Stellen Sie sich vor, "eins" und "zwei" sind Verzeichnisse.
eins = "ls eins" zwei = "ls zwei" Kreuzung $ eins $ zwei
Ich bin immer noch ziemlich grün in Bash, also zögern Sie nicht zu korrigieren, wie ich das mache. Ich brauche nur einen Befehl, der alle Dateien in "eins" und "zwei" druckt. Sie müssen in beiden existieren. Sie könnten dies den "Schnittpunkt" zwischen "eins" und "zwei" nennen.
Antworten:
quelle
comm
bis heute nichts davon wusste. Das hat gerade meine ganze Woche gemacht :)comm
erfordert, dass die Eingaben sortiert werden. In diesem Fall wirdls
die Ausgabe automatisch sortiert, andere Verwendungszwecke müssen dies jedoch möglicherweise tun:comm -12 <(some-command | sort) <(some-other-command | sort)
public
Methode zu finden ,error()
die von einem Merkmal in Kombination mit bereitgestellt wirdgit grep
, und es war fantastisch! Ich rannte$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
und zum Glück hatte ich nur den Namen der Datei, die das Merkmal enthielt.Lösung mit
comm
comm
ist toll, muss aber mit sortierter Liste arbeiten. Und zum Glück verwenden wir hierls
welche vonls
Bash ManpageAlternative mit
sort
Schnittpunkt zweier Listen:
symmetrischer Unterschied zweier Listen:
Bonus
Spiel damit ;)
quelle
Verwenden Sie den
comm
Befehl:"sort" wird nicht wirklich benötigt, aber ich füge es immer ein, bevor ich "comm" für alle Fälle verwende.
quelle
Eine weniger effiziente (als Kommunikations-) Alternative:
quelle
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
bewirkt nichts, da die Sortierung die Duplikate entfernt hat, bevor uniq nach ihnen sucht. Ich denke, Sie haben nicht verstanden, was mein Befehl tut.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
, etwas auszugeben. Mein Befehl sollte(ls 1; ls 2) | sort | uniq -d
ohne das lauten ,-u
um den Listenschnittpunkt anzuzeigen. @ MikaëlMayer hatte recht, dass mein ursprünglicher Befehl gebrochen war.ls
etwas anderes ersetzen können, zfind
. Ihre Lösung lässt dies nicht zu, da einer der Befehle, wenn er zwei Zeilen gleich zurückgibt, ihn als Duplikat aufnimmt. Meins funktioniert auch dann, wenn der Benutzerls 1/*
alle Dateien in Unterverzeichnissen vergleichen möchte . Ansonsten funktioniert es ja auch. Es ist möglich, dass meine Bash-spezifisch ist.Join ist eine weitere gute Option, abhängig von der Eingabe und der gewünschten Ausgabe
quelle
Es gibt eine weitere Stackoverflow-Frage "Array-Schnittpunkt in Bash", die als Duplikat davon markiert ist. Meiner Meinung nach ist es nicht ganz dasselbe, da es sich bei dieser Frage um den Vergleich zweier Bash-Arrays handelt, während sich diese Frage auf Bash-Dateien konzentriert. Eine einzeilige Antwort auf die andere Frage, die jetzt geschlossen ist, lautet wie folgt:
Das Dienstprogramm comm führt eine alphanumerische Sortierung durch, während die Antworten "Array-Schnittpunkt in Bash" Zahlen verwenden. daher die Verwendung von "sort" und "sort -g".
quelle