2017-01-12 1 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 

EDIT: 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

あなたはそれが何をしたいのか明確にすることはできますか?特に、それぞれの組み合わせのために一度( '(かつて指揮して=「medが」、と一度COND =「nomed」と)sublist.txt内の各行について、または二回行ごとに一度fslmerge'、または20回実行する必要がありますcondとn)?それが最後のものであれば、入力ファイルは何ですか(SUBJ/cond/nの組み合わせごとに1つの入力しか表示されないようです)。最後のものでなければ、出力ファイルは何であると思われますか(あなたはcondとnをファイル名の一部として表示するようです)。 –

+0

一般的な考え方は、すべての入力ファイル名を配列に追加した後、$ {array [@]} "'を使用してそれらのすべてをコマンドの最後に置くことです。しかし、私はあなたの出力ファイルが各入力ファイルごとに異なるので、あなたがこれをやりたいことを理解していません。 – Barmar

+0

こんにちはゴードン、お世話になりました。あなたの質問は素晴らしいです、そして、私はこれが私がうんざりしているところだと思っています、そして、進め方について一般的に混乱しています。あなたが与えた最後の例です:各科目(SUBJ)には2つの条件(med、no med)があります。各条件に対して、各サブジェクトには複数のコンポーネントファイル(n)があります。 – edub

答えて

2

私は右理解してる場合は、各指揮/ 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は「/ some/path」です。 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のようになります。

警告:これは完全にテストされていない、と私は私が質問を右に理解し、完全にはよく分かりません。これを実行する前に重要なことをすべてバックアップしてください。

私は、すべて大文字の変数名を使用することをお勧めします(予約されているものがいくつかありますが、そのうちの1つを誤って使用すると変なことが起こります)。また、それは場合には、変数の値は、スペースや他のシェルのメタ文字が含まれている、(私は"$OUTPUT/stage2_ic00${n}_${cond}.nii.gz"で行ったように)変数の展開を含め、二重引用符文字列に良い考えです。

+1

'inputfileprefixes + =(" $ INPUTDIR/stage2_ $ subj ")'を最初のループで直接実行できませんでしたか? – melpomene

+0

@melpomene:いい考えです。編集来... –

+0

@Gordon:ありがとうございました!これは完璧に機能しました。特に、私が問題を明確にするのが難しいようで、すべてを説明する時間をとっていただきありがとうございます。乾杯! :) – edub

関連する問題