gnu parallel Escape-Zeichen vor dem Leerzeichen im Befehl entfernen

872
Carambakaracho

Ich teste derzeit gnu parallel, um einen Vergleichsbefehl mit bash auf mehrere Server zu verteilen. In seiner grundlegendsten Funktion benötigt dieser Vergleichsbefehl zwei Eingaben zum Vergleich (Oracle-Datenbankzugriffe) und erfordert einen Ausgabedateinamen über -o. Das Programm muss mindestens eine Aktion laden, speichern oder direkt hochladen.

compare -o cmp.input1.input2.dat Input1 Input2 

Ich habe einige tausend dieser Eingabepaare und erstelle eine Datei mit allen Kombinationen, so dass jede Zeile den Ausgabedateinamen und die vom Programm benötigten Datenbankkennungen enthält

#test_parallel -o cmp.input1.input2.dat Input1 Input2 -o cmp.input1.input3.dat Input1 Input3 -o cmp.input2.input3.dat Input2 Input3 [...] 

und führen Sie den Befehl mit parallel aus, der Compare-Befehl schlägt jedoch fehl

parallel -a test_parallel "compare {}" ERROR: No action specified for results (load, save or direct upload) usage: compare [-u][-o <file>] query target 

Mit dem --dryrunModus wird dies parallel ausgeführt:

compare -o\ cmp.input1.input2.dat\ Input1\ Input2 

Aus irgendeinem Grund verstehe ich nicht, dass das verdeckte Leerzeichen vom Vergleichsprogramm nicht korrekt verarbeitet wird. Wenn Sie diesen Befehl in Bash ausführen, wird dieselbe Fehlermeldung angezeigt. Wenn Sie das Escape-Zeichen nach dem Flag -o entfernen (ich könnte den Befehl -o zum Befehl parallel verschieben), wird der Fehler "zu viele Argumente" angezeigt. Das Entfernen aller Escape-Befehle führt den Befehl wie erwartet aus.

Kann man parallel dazu sagen, dass die Escape-Anweisung beim Befehlsaufruf nicht gedruckt wird? Ich scheine in der Dokumentation nichts zu finden, außer dass dies das erwartete Standardverhalten ist, wie durch angegebenparallel --shellquote

1

1 Antwort auf die Frage

2
Ole Tange

GNU Parallel behandelt Eingaben als ein einziges Argument und zitiert es, sodass Sie Dateinamen wie folgt verwenden können:

My brother's 12" records costs 30$ each.txt 

In Ihrem Fall möchten Sie, dass das Argument von der Shell analysiert wird, sodass die Leerzeichen nicht in Anführungszeichen gesetzt werden:

parallel -a test_parallel eval compare {} 

Oder du kannst dich vom Weltall trennen:

parallel --colsep ' ' -a test_parallel compare 

Aber da Sie alles und alles miteinander vergleichen wollen, können Sie es viel eleganter machen:

parallel cmp -o ../out/cmp.. ::: Input* ::: Input* 

Dadurch werden alle Eingaben * mit allen Eingaben * verglichen. Mit --resultskönnen Sie die Ausgaben schön strukturiert in einem Verzeichnis erhalten:

parallel --results out/ cmp ::: Input* ::: Input* 

Wenn Sie jedoch das Laufen cmp InputY InputXnach dem Laufen überspringen möchten, cmd InputX InputYkönnen Sie Folgendes tun:

parallel --results out/ cmp {=1' $arg[1] ge $arg[2] and $job->skip();' =} ::: Input* ::: Input* 
Danke, Ole, die Kombination mit "eval" ist genau das, was ich brauchte. Die Aufteilung nach Speicherplatz wird wahrscheinlich nicht funktionieren, da sich die Anzahl der Argumente je nach Eingabe ändert. Das Vergleichsprogramm, das ich verwende, führt einen Vergleich biologischer Sequenzen durch und zeigt die nächsten Übereinstimmungen an, ein sehr spezieller Anwendungsfall. Carambakaracho vor 7 Jahren 0