在R中结合GNU Parallel与Perl替换实现mhcflurry-predict并行任务
解决方案
核心思路
针对每个ciwdfile单独处理内容(逗号转空格),将处理后的等位基因串作为单个完整参数传递给mhcflurry-predict,同时通过GNU Parallel实现ciwdfiles与pepfiles的全组合并行执行。
具体实现步骤
- 确保GNU Parallel已安装(Mac下默认无,需通过Homebrew安装):
brew install parallel
- GNU Parallel命令(可直接在终端测试)
parallel ' # 读取当前ciwdfile内容,将逗号替换为空格并保存到变量 alleles=$(sed "s/,/ /g" {}) # 执行预测,用双引号包裹$alleles避免参数被空格拆分 mhcflurry-predict --alleles "$alleles" \ --peptides-file {}2 \ --out-file "{.}_{2/.txt/.predict.txt}" ' ::: C*.txt ::: pep*.txt
::: C*.txt:指定所有ciwdfile作为第一个输入集合::: pep*.txt:指定所有pepfile作为第二个输入集合,Parallel会自动生成两个集合的全组合{}:代表当前迭代的ciwdfile,{}2代表当前配对的pepfile{.}:自动去掉ciwdfile的后缀名,{2/.txt/.predict.txt}:将pepfile的.txt后缀替换为.predict.txt,生成唯一输出文件名
- 嵌入到R的system()函数中
由于R字符串需要转义双引号,需对命令中的双引号做转义处理:
system( command = 'parallel \'alleles=$(sed "s/,/ /g" {}); mhcflurry-predict --alleles "$alleles" --peptides-file {}2 --out-file "{.}_{2/.txt/.predict.txt}"\' ::: C*.txt ::: pep*.txt', wait = FALSE # 设置为FALSE让R不等待并行任务完成,按需调整为TRUE )
关键注意事项
- 必须用双引号包裹
$alleles:这是解决参数拆分问题的核心,确保替换后的空格不会被Shell解析为多个独立参数 - Mac下的sed语法:默认使用BSD sed,
s/,/ /g的写法完全兼容,无需额外调整 - 输出文件名规则可根据实际需求修改,只要保证每个文件组合的输出不重复即可
内容的提问来源于stack exchange,提问作者Livia Tran
相关产品推荐
相关产品推荐

