在修改colsep输入时从输入文件运行GNU并行

时间:2017-06-27 10:32:29

标签: bash gnu-parallel

我是GNU并行的新手,而且我对一般的bash知之甚少,所以我真的很感激一些建议。

我希望逐行读取包含第一列中文件路径的输入文件和第二列中第二个文件的路径,并且对于每一行,使用列作为命令中的输入。但是,我需要替换第一列中的部分文件名以使我的命令工作。

该文件看起来像这样,两个文件路径由制表符分隔:

path_to_file/filename1_combined_R1_001.bam \t path_to_file/filename1.fna
path_to_file/filename2_combined_R1_001.bam \t path_to_file/filename2.fna

我需要做的是删除字符串" _R1_001.bam"从第一列开始,用我自己的字符串(例如_R1_fastq)替换它,以调用名为removeM的脚本。仅供参考,我不确定我是否正确使用--colsep。命令如下:

parallel -j10 --colsep '\t' input_file.tsv removeM -1 {1}_R1.fastq -2 {1}_R2.fastq -i {2}  -f CoralRemoved_{1}_R1.fastq -r CoralRemoved_{}_R2.fastq`

据我所知,我可以使用基名去除(类似于{1.}),但我无法弄清楚除了扩展名(.bam)之外的其他方法。

提前谢谢你。

3 个答案:

答案 0 :(得分:2)

我最终为自己搞清楚了。我使用--colsep将文件拆分为字段,然后使用正则表达式替换字符串。等号前面的1表示打印第一个字段,而等号内的正则表达式执行字符串替换。

parallel -j10 --colsep '\t'-a $2 removeM -1 bamToFastq_{=1s/_R1_001.bam//=}_R1.fastq.gz -2 bamToFastq_{=1s/_R1_001.bam//=}_R2.fastq.gz -i {2} -f CoralRemoved_bamToFastq_{1}_R1.fastq -r CoralRemoved_bamToFastq_{1}_R2.fastq

答案 1 :(得分:0)

我很难理解您要运行的确切命令,但我认为您可以使用sed更改文件,因为您将其输入到 GNU Parallel 中这样:

sed 's/_R1_001.bam/_R1_fastq/' input_file.tsv | parallel -j10 -colsep '\t' removeM ...

请注意,这不会永久更改您的文件input_file.tsv,而是会将其动态修改为 GNU Parallel

另请注意,如果您只是运行,您可以看到它正在做什么:

sed 's/_R1_001.bam/_R1_fastq/' input_file.tsv

答案 2 :(得分:0)

这不能回答完整的问题,因此请将其视为评论。

版本20170322引入了动态替换字符串,这在这里可能很有用。

动态替换字符串是一个带有参数的--rpl定义。该参数在替换字符串中使用with()并在代码中用作$$ 1(和$ 2,$$ 3 ...如果有更多()-groups)。以下是一些示例,每个示例都对应于Bash参数扩展:

# Bash ${a:-myval}                                     
--rpl '{:-([^}]+?)} $_ ||= $$1',
# Bash ${a:2}                                                                      
--rpl '{:(\d+?)} substr($_,0,$$1) = ""',
# Bash ${a:2:3}                                                                    
--rpl '{:(\d+?):(\d+?)} $_ = substr($_,$$1,$$2);',
# Bash ${a#bc}                                                                     
--rpl '{#([^#][^}]*?)} s/^$$1//;',
# Bash ${a%def}                                                                    
--rpl '{%([^}]+?)} s/$$1$//;',
# Bash ${a/def/ghi} ${a/def/}                                                      
--rpl '{/([^}]+?)/([^}]*?)} s/$$1/$$2/;',
# Bash ${a^a}                                                                      
--rpl '{^([^}]+?)} s/^($$1)/uc($1)/e;',
# Bash ${a^^a}                                                                     
--rpl '{^^([^}]+?)} s/($$1)/uc($1)/eg;',
# Bash ${a,A}                                                                      
--rpl '{,([^}]+?)} s/^($$1)/lc($1)/e;',
# Bash ${a,,A}                                                                     
--rpl '{,,([^}]+?)} s/($$1)/lc($1)/eg;',

顺便说一句,如果您使用--plus,则会启用这些。

所以要从末尾删除一个字符串(或更准确地说:一个正则表达式):

$ parallel --plus echo {%_R1_001.bam} ::: MyOrganism_R1_001.bam
MyOrganism

或者替换字符串:

$ parallel --plus echo {/_R1_001.bam/_R1.fastq.gz} ::: MyOrganism_R1_001.bam
MyOrganism_R1.fastq.gz

或者你可以自己创作自己想要移除的数量。或者你想删除的数量:

$ parallel --rpl '{_(\d+)} s/([_.][^_.]*){$$1}$//' \
   echo {_1} {_2} {_3} ::: filename2_combined_R1_001.bam
filename2_combined_R1_001 filename2_combined_R1 filename2_combined

然后,您可以在--rpl中找到此~/.parallel/config定义。