bash文件读取,while循环

时间:2011-10-01 01:28:22

标签: bash file-io do-while

我很抱歉,如果这已得到回答,但由于我不肯定究竟是什么问题(在几种可能性中)我在搜索中没有成功。

我想要做的是将标签编号分别写入文本文件中的一行,使用包含该标签的文件进行操作,并将结果输出到文件中。我有这个:

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 个答案:

答案 0 :(得分:1)

你知道循环是否在最后一行运行吗?由于缺少换行终止符,Bash可能正在跳过最后一行。尝试在文件的最后一行添加换行符,看看是否能解决问题。

答案 1 :(得分:1)

只需添加'echo $ line',您就会看到读取循环是否按预期工作。

答案 2 :(得分:0)

使用

删除第一个管道
while read line; do
  ...
done <good_PFC.txt

答案 3 :(得分:-1)

尝试将fslstsats命令放在后面的刻度中:

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

`