GNU Parallel中的基本名称

ATp*_*int 5 gnu 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"
Run Code Online (Sandbox Code Playgroud)

导致文件RG1.out,RG2.out等。有什么想法吗?

jay*_*oby 8

使用内置的剥离选项

  1. Dirname({/})和basename({%})并删除自定义后缀({^suffix}

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

  2. 获取基本名称,并删除last({.})或任何({:})扩展名

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

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

ls RG*.txt | parallel "command.sh {.}-t.txt {.}-n.txt > {.}.out"
Run Code Online (Sandbox Code Playgroud)

  • 在并行 20190422 中,“{/}”似乎相当于“basename”,“{//}”相当于“dirname”。 (3认同)
  • 好吧,看来这只适用于 20161222 之后的版本。我升级到 20201222(“疫苗”)。一定喜欢平行,因为它独特的幽默:0 (2认同)

Mar*_*ell 2

尝试parallel这样喂食:

ls RG*t.txt | cut -d'-' -f1 | parallel 'command.sh {}-t.txt {}-n.txt > {}.out'
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意awk

ls RG*t.txt | awk -F'-' '{print $1}' | parallel ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意sed

ls RG*t.txt | sed 's/-.*//' | parallel ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢 GNU grep

ls RG* | grep -Po '.*(?=-t.txt)' | parallel ...
Run Code Online (Sandbox Code Playgroud)