GNU Parallel 中的基本名称

Basename in GNU Parallel

我有几百个文件,命名如下:

RG1-t.txt

RG1-n.txt

RG2-t.txt

RG2-n.txt

等...

我想使用与 运行 脚本并行的 GNU,但我很难获得文件的基本名称,所以 RG1、RG2 等...这样我就可以 运行 :

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

生成文件 RG1.out、RG2.out 等。 有什么想法吗?

尝试像这样喂 parallel

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

或者,如果您喜欢 awk

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

或者,如果您更喜欢 sed

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

或者,如果您更喜欢 GNU grep:

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

使用--rpl:

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

或动态替换字符串 --plus:

printf '%s[=11=]' RG*-n.txt |
  parallel -0 --plus "command.sh {%-n.txt}-t.txt {} > {%-n.txt}.out"

printf避免:

bash: /bin/ls: Argument list too long

使用built-in stripping options:

  1. Dirname ({/}) and basename ({%}) and remove custom suffix ({^suffix})

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

  2. Get basename, and remove last ({.}) or any ({:}) extension

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

这应该可以满足您的需要:

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