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

标签 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

最佳答案

@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/

相关文章:

c++ - 我如何让一个进程在 linux 中重新加载自己?

linux - 无法为 git 匹配 ssh key 。改为制作本地指纹?

shell - AIX:使用 grep 命令记录文件中的两行

bash - 使用 awk/bash 过滤 ldapsearch

linux - awk 按列对特定组求和

awk - awk中如何剪切字段

linux - 如何使用 "top"仅提取 CPU 使用率和进程名称(命令)列?

linux - MongoDB 备份 -> tar -> gz -> gpg

c - Autoconf 检查 struct flock

Unix 粘贴命令覆盖数据