чтение файлов Bash, в то время как цикл - PullRequest
2 голосов
/ 01 октября 2011

Извините, если на этот вопрос ответили, но, поскольку я не уверен, в чем именно заключается проблема (среди нескольких возможностей), я не добился успеха в своих поисках.

Что я хочу сделатьэто взять номера меток, каждый из которых записан в виде строки в текстовом файле, выполнить действия с файлами, содержащими эту метку, и вывести результаты в файл.Вот что у меня есть:

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, а не файл», но ничего не делает с 132, который, как я знаю, указывает на настоящий файл.Поэтому я считаю, что что-то не так с синтаксисом в моем цикле while, но я не знаю что!Могу поспорить, что это что-то глупое, но я просто не могу понять это.Спасибо!

ETA: Исправлено добавлением новой строки в конец good_PFC.txt. Теперь проблема в том, что мне нужна новая строка, записываемая в выходной файл всякий раз, когда я получаю новую метку, но она этого не делает,Я попытался сначала добавить

echo /n >> FA_unc_stats.txt

, но он печатает "/ n" на своей собственной строке ... Я не выполняю команды новой строки!

Ответы [ 4 ]

1 голос
/ 01 октября 2011

Просто добавьте 'echo $ line', и вы увидите, работает ли цикл чтения так, как вы ожидаете.

1 голос
/ 01 октября 2011

Знаете ли вы, запускается ли цикл в последней строке вообще?Bash может пропустить последнюю строку из-за отсутствия символа новой строки.Попробуйте добавить новую строку в последнюю строку в файле и посмотрите, решит ли это проблему.

0 голосов
/ 01 октября 2011

Снимите первую трубу с

while read line; do
  ...
done <good_PFC.txt
0 голосов
/ 01 октября 2011

попробуйте поместить команды fslstsats в тики назад:

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

`

...