我是与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`
据我所知,我可以使用Basename删除(类似{1.}(,但我不知道如何删除更多的删除(.bam(。
预先感谢您。
我最终为自己弄清楚了。我使用 - 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
我很难理解您要运行的确切命令,但是我认为当您将其馈送到 gnu并行时,您可能可以使用sed
更改文件。/strong>这样:
sed 's/_R1_001.bam/_R1_fastq/' input_file.tsv | parallel -j10 -colsep 't' removeM ...
请注意,这不会永久更改您的文件input_file.tsv
,而是将其修改为 fly ,因为它将其传递给 gnu Parallel 。
还请注意,如果您刚运行,您可以看到它在做什么:
sed 's/_R1_001.bam/_R1_fastq/' input_file.tsv
这不会回答整个问题,因此将其视为评论。
版本20170322引入了动态替换字符串,在这里可能很有用。
动态替换字符串是--rpl
的定义,该定义采用了一个参数。该参数在替换字符串中使用((在代码中使用,以作为$ 1(和$$ 2,$$ 3 ...(运行,如果有更多(( - 群体(。这里有几个示例,每个示例都对应于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
。
因此,要从末端删除字符串(或更准确:regexp(,您可以使用:
$ 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
然后,您可以在~/.parallel/config
中具有此--rpl
定义。