2

如果这个问题已经得到解答,我很抱歉,但由于我不确定到底是什么问题(在几种可能性中),我的搜索没有成功。

我想要做的是获取每个都写为文本文件中的一行的标签编号,对包含该标签的文件执行操作,并将结果输出到文件中。我所拥有的是:

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

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 回答