我试图在线排序各种线程,并且无法确定如何将输出传输到后续命令。我正在使用批处理脚本(通过bash)通过独立程序连接多个文件,这需要输入采用特定格式。
程序中用于连接的标准命令是:
fslmerge -t $OUTPUT $INPUT1 $INPUT2... $INPUT n
我已经尝试了几种方法来定义输入文件,下面是最近的尝试。
file=$INPUTDIR/sublist.txt
while read -r SUBJ; do
for cond in "med" "nomed"; do
for n in {01..10}; do
INPUT="stage2_${SUBJ}_${cond}_00${n}.nii.gz"
fslmerge -t $OUTPUT/stage2_ic00${n}_${cond}.nii.gz `ls $INPUTDIR/$INPUT`
done; done; done < $file
但是,这导致在每个输入上分别运行命令而不是在所有输入上运行命令(如上面“标准命令”中所述):
fslmerge -t $OUTPUT $INPUTDIR/subject1
fslmerge -t $OUTPUT $INPUTDIR/subject2
...
fslmerge -t $OUTPUT $INPUTDIR/subject10
编辑:
sublist.txt列出如下。它们按照我需要通过fslmerge
进行连接的顺序堆叠。
SUB003
SUB006
SUB007
SUB010
SUB011
SUB001
SUB004
SUB008
SUB009
对于每种情况(med,no med),每个受试者都有多个成分(n)。最终,我需要运行命令,以便它连接给定条件和组件的所有主题。一个例子是:
fslmerge -t $OUTDIR/stage2_ic0001_med.nii.gz stage2_SUB003_med_0001.nii.gz stage2_SUB006_med_0001.nii.gz stage2_SUB007_med_0001.nii.gz ... stage2_SUB009_med_0001.nii.gz
我非常感谢关于这个问题的任何意见和/或简化方法!而且我在编码方面相对较新,因此对任何术语错误都表示诚挚的道歉。我意识到我的尝试可能完全脱离了这个世界。
答案 0 :(得分:2)
如果我理解正确,你想为每个cond / n组合运行命令,并合并所有主题的输入文件(即sublist.txt中列出的每个人)。是对的吗?如果是这样,我要做的就是将所有主题存储在一个数组中,然后使用该数组为每个主题生成输入文件列表:
subjectsfile=$INPUTDIR/sublist.txt
subjects=()
inputfileprefixes=()
while read -r subj; do
subjects+=("$subj") # this isn't really needed, since we don't use the list directly.
inputfileprefixes+=("$INPUTDIR/stage2_$subj")
done <"$subjectsfile"
for cond in "med" "nomed"; do
for n in {1..20}; do
fslmerge -t "$OUTPUT/stage2_ic00${n}_${cond}.nii.gz" "${inputfileprefixes[@]/%/_${cond}_00${n}.nii.gz}"
done
done
这里有一些稍微沉重的阵列技巧。像"${arrayname[@]/%/something}"
这样的东西需要一个数组,并且可以解决问题。到每个元素的末尾。所以说主题是&#34; alice&#34;,&#34; bob&#34;和&#34; cecil&#34;和INPUTDIR是&#34; / some / path&#34;。然后subjects
设置为("alice" "bob" "cecil")
,inputfileprefixes
设置为("/some/path/stage2_alice" "/some/path/stage2_bob" "/some/path/stage2_cecil")
,并且每个cond / n组合都会在相应的后缀上添加并将该列表传递给{{ 1}},所以命令就像fslmerge
一样。
警告:这尚未经过全面测试,我并不完全确定我理解这个问题。在运行之前备份所有重要的内容,以防万一愚蠢。
顺便说一下,我建议不要使用all-caps变量名(有一些被保留,你将错误地使用其中一个,并且会发生奇怪的事情)。另外,如果变量&#39;是一个好主意,可以双引号包含变量扩展的字符串(就像我对fslmerge -t $OUTPUT/stage2_ic001_med.nii.gz /some/path/stage2_alice_med_001.nii.gz /some/path/stage2_bob_med_001.nii.gz /some/path/stage2_cecil_med_001.nii.gz
所做的那样)。值包含空格或其他shell元字符。