2017-01-12 52 views
-2

我試圖通過各種線程在線排序,並且無法確定如何將輸出管道輸送到後續命令。我正在使用批處理腳本(通過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

你能澄清你想要它做什麼嗎?特別是,它應該在sublist.txt中爲每一行運行'fslmerge',或者每行運行兩次(一次使用cond =「med」,一次使用cond =「nomed」),或者二十次(每次組合一次cond和n)?如果是最後一個,那麼輸入文件是什麼(你似乎只顯示每個SUBJ/cond/n組合的一個輸入);如果它不是最後一個,輸出文件應該是什麼(你似乎顯示cond,而n是文件名的一部分)。 –

+0

一般的想法是將所有輸入文件名添加到數組中,然後使用'「$ {array [@]}」'把它們全部放在命令的末尾。但我也不明白你想怎麼做,因爲你的輸出文件對於每個輸入文件都是不同的。 – Barmar

+0

嗨戈登,非常感謝您的幫助!你的問題非常好,我認爲這是我搞亂的地方,並且一直對如何進行感到困惑。這是你給出的最後一個例子:每個主題(SUBJ)有兩個條件(med,no med)。對於每個條件,每個主題都有多個組件文件(n)。 – edub

回答

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}"這樣的東西需要一個數組,並在每個元素的末尾粘貼「某物」。所以說主題是「愛麗絲」,「鮑勃」和「塞西爾」,INPUTDIR是「/某些/路徑」。然後subjects被設置爲("alice" "bob" "cecil"),inputfileprefixes被設置爲("/some/path/stage2_alice" "/some/path/stage2_bob" "/some/path/stage2_cecil"),並且對於每個cond/n組合,它在適當的後綴上粘貼並將該列表傳遞給fslmerge,所以命令如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元字符的情況下,對包含變量擴展的字符串進行雙引號是個好主意(就像我在"$OUTPUT/stage2_ic00${n}_${cond}.nii.gz"中所做的那樣)。

+1

難道你不能直接在第一個循環中執行'inputfileprefixes + =(「$ INPUTDIR/stage2_ $ subj」)'嗎? – melpomene

+0

@melpomene:好主意;編輯來... –

+0

@戈登:非常感謝!這很好,我真的很感謝你抽出時間來解釋一切,特別是我似乎很難解釋這個問題。乾杯! :) – edub