2

これが回答されている場合は申し訳ありませんが、(いくつかの可能性の中で)正確に何が問題なのか確信が持てないため、検索に成功していません.

私がやりたいのは、テキスト ファイルに 1 行ずつ書かれているラベル番号を取得し、そのラベルを含むファイルで処理を行い、結果をファイルに出力することです。私が持っているのはこれです:

cat good_PFC.txt | while read line;
do  
 base_file=${line}_blah.nii.gz
 new_fa=${line}_fa_uncmasked.nii.gz
 new_tr=${line}_tr_uncmasked.nii.gz 

 if [ -e $base_file ]; then

  echo -n "$line " >> FA_unc_stats.txt
  fslstats $new_fa -M | tr '\n' ' ' >> FA_unc_stats.txt
  fslstats $new_fa -S | tr '\n' ' ' >> FA_unc_stats.txt     

 else
  echo $line "not a file"
 fi;
done

fslstats は数値を出力するコマンドであり、good_PFC.txt は次を含むテスト ファイルです。

123
125
132

FA_unc_stats.txt の出力は次のとおりです。

123 0.221061  0.097268

間違っているのは、端末が「125 not a file」を正しく出力しますが、実際のファイルを指していることがわかっている132では何もしません。そのため、while ループの構文に何か問題があると思いますが、何が原因かわかりません! それはばかげているに違いないのですが、私にはそれがわかりません。ありがとう!

ETA: good_PFC.txt の末尾に改行を追加することで修正されました。問題は、新しいラベルに到達するたびに出力ファイルに改行を書き込む必要があることですが、それが行われません。追加してみました

echo /n >> FA_unc_stats.txt

最初に、「/n」を独自の行に出力します...改行コマンドで失敗します!

4

4 に答える 4

1

最後の行でループが実行されているかどうか知っていますか? 改行ターミネータがないため、bash が最後の行をスキップしている可能性があります。ファイルの最後の行に改行を追加して、問題が解決するかどうかを確認してください。

于 2011-10-01T01:32:52.790 に答える
1

「echo $line」を追加するだけで、読み取りループが期待どおりに機能しているかどうかを確認できます。

于 2011-10-01T01:34:59.403 に答える
0

で最初のパイプを取り外します

while read line; do
  ...
done <good_PFC.txt
于 2011-10-01T01:43:45.440 に答える
-1

fslstsats コマンドをバックティックに入れてみてください:

`fslstats $new_fa -M | tr '\n' ' ' >> FA_unc_stats.txt`
 `fslstats $new_fa -S | tr '\n' ' ' >> FA_unc_stats.txt

`

于 2011-10-01T01:34:51.153 に答える