在 GNU 并行中组合替换字符串和正则表达式



>我有一个格式的文件路径列表:

/data/nicotine_sensi/bam/9-2_box_1_S23_starAligned.sortedByCoord.out.bam
/data/nicotine_sensi/bam/9-2_box_3_S101_starAligned.sortedByCoord.out.bam
/data/nicotine_sensi/bam/9-3_box_1_S24_starAligned.sortedByCoord.out.bam
/data/nicotine_sensi/bam/9-3_box_3_S102_starAligned.sortedByCoord.out.bam

我想输入到 gnu 并行命令中,以便预定义的替换字符串和 perl 或--plus替换字符串同时运行,但我在教程中找不到解决方案。理想情况下,{/...}{%_starAligned}将协同工作以产生:

9-2_box_1_S23
9-2_box_3_S101
9-3_box_1_S24
9-3_box_3_S102

但是,我得到的最接近的是:

parallel --rpl '{..} s:/data/nicotine_sensi/bam/::;s:_starAligned.sortedByCoord.out.bam::' 
echo {..} ::: $(ls $bam_dir/*.bam)

这很混乱,对于其他目录来说不是很便携。

{/...}的定义是:

s:.*/::; s:.[^/.]+$::; s:.[^/.]+$::; s:.[^/.]+$::;

{%(.*)}的定义是:

s/$$1$//;

所以结合起来你可以做到:

echo /data/nicotine_sensi/bam/9-3_box_1_S24_starAligned.sortedByCoord.out.bam |
parallel --rpl '{¤([^}]+?)} s:.*/::; s:.[^/.]+$::; s:.[^/.]+$::; s:.[^/.]+$::; s/$$1$//;' echo {¤_starAligned}

如果您知道您将始终删除_something那么:

echo /data/nicotine_sensi/bam/9-3_box_1_S24_starAligned.sortedByCoord.out.bam |
parallel --rpl '{¤} s:.*/::; s:.[^/.]+$::; s:.[^/.]+$::; s:.[^/.]+$::; s/_[^_]+$//;' echo {¤}

如果您将经常使用它,那么将其放在配置文件中可能是个好主意。

最新更新