我在一个文件夹中有44个.tsv文件,我想用bedtools工具的intersect命令计算每个成对的相交数。每个输出文件将具有4列,而我只需要在每个输出文件中仅保存第4列的值之和。一一做起来很容易,但是当我使用并行处理同时完成整个过程时,会出现语法错误
这是我手动一对一地尝试每两对时的代码和结果
$ bedtools intersect -a p1.tsv -b p2.tsv -c
chr1 1 5 1
chr1 8 12 1
chr1 18 20 1
chr1 21 25 0
bedtools intersect -a p1.tsv -b p2.tsv -c | awk '{sum+=$4} END {print sum}
3
这是我使用并行处理时的代码和结果
$ parallel "bedtools intersect -a {1} -b {2} -c |awk '{sum+=$4} END {print sum}'> {1}.{2}.intersect" ::: `ls *.tsv` ::: `ls *.tsv`
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1: ^ syntax error
结果应该是44 * 44个文件,其中包含一个单值对象,例如3个
答案 0 :(得分:3)
@DudiBoy有一个很好的解决方案。但是对我来说,只是因为我想调用GNU Parallel而不得不制作另一个文件,这很烦人。
因此您也可以使用功能。这样,您无需创建新文件:
doit() {
bedtools intersect -a "$1" -b "$2" -c | awk '{sum+=$4} END {print sum}'
}
export -f doit
parallel --results {1}.{2}.intersect doit {1} {2} ::: *.tsv ::: *.tsv
答案 1 :(得分:2)
我认为您需要像这样引用它:
parallel bedtools intersect -a {1} -b {2} -c \| awk \'{sum+=\$4} END{print sum+0}\' \> {1}.{2}.intersect ::: *tsv ::: *tsv
答案 2 :(得分:2)
我相信@MarkSetchell是正确的答案。您也可以尝试通过将复杂的行插入可以测试的bash脚本中来清理它。
intersect.bash
#!/bin/bash
bedtools intersect -a $1 -b $2 -c | awk '{sum+=$4} END {print sum}'
测试intersect.bash
能否正常运行,然后使其并行。
parallel intersect.bash {1} {2}
祝你好运。