微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

并行比较两个参数并发送到命令

如何解决并行比较两个参数并发送到命令

我正在尝试使用 GNU 并行运行 recon-all 命令。它应该在 {1} 处采用一个参数,如下所示:

parallel --progress subj_id='echo {1} | cut -d / -f 3' && recon-all -s $subj_id -i {1} -sd /output ::: ${paths[@]}

在它流到侦察之前,所有 subj_id 应该从 $paths提取,因为 subj_one bash 数组 $paths 等于:

/input/subj_one/export/PAT1/2/2_MR/IM0101 /input/subj_two/export/PAT1/2/2_MR/IM0101 /input/subj_tree/export/PAT1/2/2_MR/IM0101 /input/subj_four/export/PAT1/2/2_MR/IM0101

现在看来我有错误,因为命令只是悬空。

所以并行命令应该如下所示:

parallel --progress recon-all -s subj_one -i /input/subj_one/export/PAT1/2/2_MR/IM0101 -sd /output ::: ${paths[@]}

解决方法

你的命令是:

parallel --progress subj_id='echo {1} | cut -d / -f 3' &&
  recon-all -s $subj_id -i {1} -sd /output ::: ${paths[@]}

这显然不是你的意思。你可能的意思是:

parallel --progress "subj_id=\$(echo {1} | cut -d / -f 3) && recon-all -s \$subj_id -i {1} -sd /output" ::: ${paths[@]}

但是引用很烦人,所以改为定义一个函数并使用它:

doit() {
  subj_id=$(echo "$1" | cut -d / -f 3)
  recon-all -s $subj_id -i "$1" -sd /output
}
export -f doit
parallel doit ::: ${paths[@]}

另请看--plus。它可能只是定义了一个可以直接使用的替换字符串,而不是使用 cut

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。