我在一个文件夹中有44个.tsv文件,我想用bedtools tool的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值
发布于 2019-07-02 23:27:30
@DudiBoy有一个很好的解决方案。但对我来说,仅仅因为我想调用GNU并行就不得不创建另一个文件,这让我很恼火。
所以你也可以使用函数。这样您就不需要创建新文件了:
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发布于 2019-07-02 18:42:46
我认为你需要这样引用它:
parallel bedtools intersect -a {1} -b {2} -c \| awk \'{sum+=\$4} END{print sum+0}\' \> {1}.{2}.intersect ::: *tsv ::: *tsv发布于 2019-07-02 21:13:11
我相信@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}祝好运。
https://stackoverflow.com/questions/56846032
复制相似问题