GNU Parallel中的基本名称

时间:2017-08-23 15:11:44

标签: gnu gnu-parallel

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

RG1-t.txt

RG1-n.txt

RG2-t.txt

RG2-n.txt

等...

我想使用GNU parallel来运行它们的脚本,但是我很难获得文件的基本名称,所以RG1,RG2等......这样我就可以运行了:

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

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

3 个答案:

答案 0 :(得分:5)

使用built-in stripping options

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

         

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

  2.   
  3. 获取基本名称,并删除最后一个({.})或任何({:})扩展程序

         

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

  4.   

这应该做你需要的:

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

答案 1 :(得分:1)

尝试这样喂parallel

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

或者,如果您更喜欢awk

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

或者,如果您更喜欢sed

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

或者,如果您更喜欢GNU grep

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

答案 2 :(得分:1)

使用--rpl

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

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

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

printf避免:

bash: /bin/ls: Argument list too long