在并行处理中使用awk获取语法错误

时间:2019-07-02 05:43:53

标签: linux unix awk parallel-processing gnu-parallel

我在一个文件夹中有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个

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}

祝你好运。