在 GNU 并行中提取目录模式

在 GNU 并行中提取目录模式

我正在多个文件夹/样本上运行命令行软件。每个文件夹都有这样的文件 *fastq.gz。

下面是一个文件夹的示例。

Sample_EC_only/EC_only_S1_L005_I1_001.fastq.gz Sample_EC_only/EC_only_S1_L005_R1_001.fastq.gz Sample_EC_only/EC_only_S1_L005_R2_001.fastq.gz Sample_EC_only/EC_only_S1_L006_I1_001.fastq.gz _only/EC_only_S1_L006_R1_001.fastq.gz

我正在尝试使用 gnu 并行运行多个软件,但在提取文件夹的“ID”时遇到问题。

parallel -j $NSLOTS --xapply \
" echo {1}  \
/home/rob2056/software/cellranger-2.2.0/cellranger count --id  = "{basename} {1}"  \
                   --transcriptome=$ref_data \
                   --fastqs={1} \
 " ::: $TMPDIR/FASTQ/Sample* 

我想从 gnu parallel 内的文件夹中提取例如“Sample_EC_only”作为模式。 --fastqs 能够使用 {1} 获取路径,但使用 --id 选项时出现问题。我尝试了各种选项来从 {1} 中的路径中提取模式,但不起作用。

--id 参数需要从 {1} 中的路径中提取的模式,以便它可以创建输出目录。

每个{1}由eg组成(下面仅显示一个示例)

/tmp/FASTQ/Sample_EC_only

答案1

如果我理解正确的话,您所寻找的只是{1/}而不是{1}.它是参数的“基本名称”。看人并行_教程--rpl以及我们在哪里拥有这样的讨论替换字符串的实现为

     --rpl '{/} s:.*/::'

位置替换字符串也可以使用修改/等等。这{1/}就像删除最后一个 之前的所有字符/


--rpl您可以使用后跟以 a 开头的字符串来创建自己的替换速记字符串标签{/}在上面的例子中),然后是一个perl表达式,例如上面的替换命令(s:图案:替代品:)。

我不确定什么是允许的标签,但我们可以使用教程示例{..}作为位置标签,即可以与{数字}。用于删除最后/一个单词“Sample_”之前的所有内容的 perl 表达式将是:s:.*/Sample_::所以您需要在--xapply参数之前添加

--rpl '{..} s:.*/Sample_::'

然后使用--id={1..}将此替换应用于 arg 1。例如,如果您想要删除第一个下划线之前的单词_,而不是固定单词Sample,则可以使用如下模式

--rpl '{..} s:.*/[^_]*_::'

最终命令应如下所示:

parallel -j $NSLOTS --rpl '{..} s:.*/Sample_::' --xapply \
" echo {1}  \
/home/rob2056/software/cellranger-2.2.0/cellranger count --id={1/} \
                   --id2={1..} \
           --transcriptome=$ref_data \
           --fastqs={1} \
 " ::: $TMPDIR/FASTQ/Sample* 

相关内容