Wie verwende ich die "Filter" -Option von GNU split mit GNU parallel?

2252
saffsd

Ich versuche, eine Reihe riesiger gz-Dateien in komprimierte g-gepackte N-Linien zu zerlegen.

Um dies zu demonstrieren, betrachten wir Folgendes:

seq 100 | gzip > big_file0.gz 

Ich kann dies wie folgt in mehrere komprimierte 10-Zeilen-Dateien aufteilen:

zcat big_file0.gz | split -l 10 --filter='gzip > $FILE.gz' - big_file0. 

Nehmen wir an, wir haben einige große Dateien big_file0.gz, big_file1.gz...

Ich möchte jetzt jede dieser Dateien mit GNU parallel aufteilen. Hier ist der Befehl, mit dem ich komme:

parallel "zcat {} | split -l 10 --filter='gzip > $FILE.gz' - {.}." ::: big_file0.gz big_file1.gz 

Die Shell-Ersetzung für $FILEfunktioniert jedoch nicht wie erwartet. $FILEwird durch eine leere Zeichenfolge ersetzt, sodass die gesamte Ausgabe in eine aufgerufene Datei geschrieben wird .gz.

Wie kann ich erreichen, dass die $FILEVertretung in GNU parallel funktioniert?

3

2 Antworten auf die Frage

3
Kyle Jones

Shell expansion of variables is converting $FILE to an empty string. You need to put a backslash in front of $FILE to prevent the shell from doing the expansion.

0
Ole Tange

Heute würden Sie die --pipeOption von GNU Parallel verwenden :

parallel --seqreplace // "zcat {} | parallel --pipe -N 10 gzip '>{.}.{#}.gz'" ::: big_file0.gz big_file1.gz 

Wenn Sie mit dem Hinzufügen zufrieden sind big_file0.gz big_file1.gz, ist es noch einfacher:

zcat big_file0.gz big_file1.gz | parallel --pipe -N 10 gzip '>{#}.gz'