将多个文件管道化为$ variable

时间:2017-01-12 23:33:54

标签: bash

我试图在线排序各种线程,并且无法确定如何将输出传输到后续命令。我正在使用批处理脚本(通过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

我非常感谢关于这个问题的任何意见和/或简化方法!而且我在编码方面相对较新,因此对任何术语错误都表示诚挚的道歉。我意识到我的尝试可能完全脱离了这个世界。

1 个答案:

答案 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元字符。