我在一个文件夹中有 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
最佳答案
@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
关于linux - 在并行处理中使用 awk 获取语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846032/