Wenn xargs map ist, was ist filter?

9

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

haben %Vor%

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

%Vor%

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:

%Vor%

Es ist das hypothetische Programm xfilter , nach dem ich suche:

%Vor%

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:

  • eine Möglichkeit, eine Liste von Dateipfaden nach Existenz zu filtern. Das war ein spezifisches Beispiel.
  • wie schreibe ich ein solches Programm? Ich kann das tun.

Ich bin suche entweder nach:

  • eine bereits vorhandene Implementierung wie xargs oder
  • eine klare Erklärung, warum das nicht existiert
jameshfisher 27.07.2014, 08:40
quelle

3 Antworten

4

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%     
mrucci 30.11.2015 20:20
quelle
3

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:

  • Liste
  • Karte
  • Filter
  • reduzieren

Stellen Sie sich vor:

%Vor%

Erstellen eines Testfalls:

%Vor%

Sie erhalten ein Verzeichnis namens testcase und in diesem Verzeichnis 10 Dateien und ein Verzeichnis

%Vor%

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:

%Vor%

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:

%Vor%

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:

%Vor%

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:

%Vor%

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%     
jm666 27.07.2014 11:04
quelle
1

Sie können awk die Funktion filter und reduce verwenden.

Filter:

%Vor%

Reduzieren:

%Vor%     
konsolebox 27.07.2014 10:41
quelle

Tags und Links