我有数百个文件,命名如下:
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等。 有什么想法吗?
答案 0 :(得分:5)
Dirname(
{/}
)和basename({%}
)并删除自定义后缀({^suffix}
)
$ echo dir/file_1.txt.gz | parallel --plus echo {//} {/} {%_1.txt.gz}
- 醇>
获取基本名称,并删除最后一个(
{.}
)或任何({:}
)扩展程序
$ echo dir.d/file.txt.gz | parallel 'echo {.} {:} {/.} {/:}'
这应该做你需要的:
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