Ich denke an xargs
als Map-Funktion der UNIX-Shell. Was ist die Funktion filter
?
EDIT: es sieht so aus, als müsste ich etwas expliziter sein.
Nehmen wir an, ich muss ein Programm übergeben, das einen einzelnen String als Parameter akzeptiert und mit einem Exit-Code von 0 oder 1 zurückkehrt. Dieses Programm wird als Prädikat über die akzeptierten Strings fungieren.
Zum Beispiel könnte ich den String-Parameter als Dateipfad interpretieren und das Prädikat als "existiert diese Datei" definieren. In diesem Fall könnte das Programm test -f
sein, was bei einer Zeichenkette mit 0 endet, wenn die Datei existiert, und 1 andernfalls.
Ich muss auch einen Strom von Saiten übergeben. Zum Beispiel könnte ich eine Datei ~/paths
mit
Nun möchte ich eine neue Datei erstellen, ~/existing_paths
, die nur die Pfade enthält, die auf meinem Dateisystem existieren. In meinem Fall wäre das
Ich möchte dies tun, indem ich die Datei ~/paths
einlese, diese Zeilen nach dem Prädikat test -f
filtere und die Ausgabe in ~/existing_paths
schreibe. In Analogie zu xargs
würde dies wie folgt aussehen:
Es ist das hypothetische Programm xfilter
, nach dem ich suche:
Was für jede Zeile L
seiner Standardeingabe COMMAND [ARG]... L
aufruft, und wenn der Exit-Code 0 ist, wird L
ausgegeben, andernfalls wird nichts ausgedruckt.
Um klar zu sein, suche ich nicht:
Ich bin suche entweder nach:
xargs
oder Wenn Karte xargs
ist, ist Filter ... noch xargs
.
Beispiel: Dateien im aktuellen Verzeichnis auflisten und nicht ausführbare Dateien herausfiltern:
%Vor%Dies könnte durch eine (nicht produktionsreife) Funktion praktisch gemacht werden:
%Vor%Alternativ können Sie eine parallele Filterimplementierung über GNU Parallel verwenden:
%Vor%Also, du suchst das:
%Vor%was kann neu geschrieben werden als
%Vor% Die Hauptenergie von bash
ist ein Pipelining , daher brauchen Sie keinen speziellen filter
und / oder reduce
Befehl. Tatsächlich könnten fast alle Unix-Befehle in einer (oder mehreren) Funktionen wie folgt funktionieren:
Stellen Sie sich vor:
%Vor%Erstellen eines Testfalls:
%Vor% Sie erhalten ein Verzeichnis namens testcase
und in diesem Verzeichnis 10 Dateien und ein Verzeichnis
Jede Datei enthält 1000 Zeilen mit zufälligen Zeichenfolgen, einige Zeilen enthalten nur Zahlen
Führen Sie nun den Befehl
aus %Vor% und Sie erhalten die größte Zeile nur aus jeder Datei wie: 42
. (Dies kann natürlich effektiver gemacht werden, dies ist nur für eine Demo)
zerlegt:
Der find testcase -type f -print
druckt alle einfachen Dateien so, LIST (und nur auf Dateien reduziert). Ausgabe:
Der Befehl xargs grep -H '^[0-9]*$'
as MAP führt für jede Datei aus einer Liste den Befehl grep
aus. Grep verwendet normalerweise als Filter , z. B .: command | grep
, ändert aber jetzt (mit xargs) die Eingabe (Dateinamen) in (Zeilen, die nur Ziffern enthalten). Ausgabe, viele Zeilen wie:
Struktur der Zeilen: filename colon number
, wollen nur Zahlen so einen reinen Filter aufrufen, was die Dateinamen aus jeder Zeile cut -d: -f2
entfernt. Es gibt viele Zeilen aus wie:
Nun die Reduzierung (die größte Zahl erhalten), die sort -nr
sortiert die ganze Zahl numerisch und umgekehrte Reihenfolge (desc), so dass ihre Ausgabe wie folgt aussieht:
und die head -1
drucken die erste Zeile (die größte Zahl).
Natürlich können Sie Ihre eigenen Funktionen wie list / filter / map / reduce direkt mit bash
programmieren (loops, conditions und so weiter) schreiben, oder Sie können eine beliebige Skriptsprache wie perl
, spezielle Sprachen wie awk
, sed
"Sprache", oder dc
(rpn) und so.
Verfügen Sie über einen speziellen Filter Befehl wie:
%Vor%ist einfach nicht erforderlich, da Sie direkt das
verwenden können %Vor% Sie können awk
die Funktion filter
und reduce
verwenden.
Filter:
%Vor%Reduzieren:
%Vor%