2017-08-23 3 views
3

ich Hunderte von Dateien mit dem Namen, wie folgt:Basename in GNU Parallel

RG1-t.txt

RG1-n.txt

RG2-t.txt

RG2- n.txt

etc ...

würde ich mag GNU parallel verwenden, Skripte auf sie zu laufen, aber ich STRUG gle die Basisnamen der Dateien, so RG1, RG2 etc zu bekommen ... so dass ich laufen kann:

ls RG*.txt | parallel "command.sh {basename}-t.txt {basename}-n.txt > {basename}.out" 

in den Dateien RG1.out resultierenden, RG2.out usw. Irgendwelche Ideen?

Antwort

0

Versuchen parallel wie diese Fütterung:

ls RG*t.txt | cut -d'-' -f1 | parallel 'command.sh {}-t.txt {}-n.txt > {}.out' 

Oder, wenn Sie awk bevorzugen:

ls RG*t.txt | awk -F'-' '{print $1}' | parallel ... 

Oder, wenn Sie sed bevorzugen:

ls RG*t.txt | sed 's/-.*//' | parallel ... 

Oder, wenn Sie es vorziehen, GNU grep:

ls RG* | grep -Po '.*(?=-t.txt)' | parallel ... 
0

Verwendung --rpl:

printf '%s\0' RG*-n.txt | parallel -0 --rpl '{basename} s/-..txt$//' "command.sh {basename}-t.txt {basename}-n.txt > {basename}.out" 

Die printf vermeidet:

bash: /bin/ls: Argument list too long 
0

Verwenden Sie die built-in stripping options:

  1. Dirname ({/}) und Basisname ({%}) und Entfernen von benutzerdefinierten Suffix ({^suffix})

    $ echo dir/file_1.txt.gz | parallel --plus echo {//} {/} {%_1.txt.gz}

  2. Basisnamen importieren, und entfernen Sie zuletzt ({.}) oder jede ({:}) Verlängerung

    $ echo dir.d/file.txt.gz | parallel 'echo {.} {:} {/.} {/:}'

Dies sollte Mach was du brauchst:

ls RG*.txt | parallel "command.sh {.}-t.txt {.}-n.txt > {.}.out"