2つの引数を並列に比較してコマンドに送信します。

2つの引数を並列に比較してコマンドに送信します。

GNUを使用してrecon-allコマンドを並列に実行しようとしています。次のパラメータが必要です{1}

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

recon-allに移動する前に、次$pathsのようなbash配列$ pathsからsubj_idを抽出する必要があります。

/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

コマンドが保留中なのでエラーが発生したようです。

答え1

あなたのコマンドは次のとおりです

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

関連情報