2011-06-08 114 views
0

我是shell脚本的新手,所以这可能是一个愚蠢的问题。虽然我没有在网上找到答案。我正在采取同事脚本并对其进行更改以使其适用于我的数据。现在我正在运行一个只使用三个数据文件的测试。代码在脚本中经过一个for循环,并且它应该为每个不同的文件运行一次(三次)。for循环中堆叠的文件名

listtumor=`cat /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/MatchedTumorTest.txt` 
for i in $listtumor 
do 
lst=`ls /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/freshstart/${i}*.txt | awk -F'/' '{print $9}'` 

MatchedTumorTest.txt只是包含了我使用的测试没有“.TXT”至于我可以告诉三种不同的文件名,这个代码应该只是通过脚本运行三次,每个文件。相反,我得到这个错误:

ls: /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/freshstart/TCGA-04-1514-01A-01D-0500-02_S01_CGH_105_Dec08\rTCGA-04-1530-01A-02D-0500-02_S01_CGH_105_Dec08\rTCGA-04-1542-01A-01D-0500-02_S01_CGH_105_Dec08*.txt: No such file or directory 

出于某种原因,所有的文件名都堆放在彼此的顶部,而不是循环将每个单独的一个。任何想法为什么发生这种情况?

谢谢, T.J.

回答

1

它看起来像您的文本文件中的行可能由回车而不是换行符分隔。由于没有在您的示例文件名中有空格,则for循环应该,如果你初始化listtumor喜欢这个工作得很好:

listtumor=`tr '\r' '\n' < /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/MatchedTumorTest.txt` 

tr命令将翻译回车到换行,这是大多数文本处理器(如shell自己的命令)将会期待),并将结果写入标准输出。

+0

这也适用!我被要求不要使用while循环,所以我用它来代替。谢谢! – 2011-06-10 03:49:22

1

对于某些类型的分隔符,for循环不太适合。试试这个:

while read line; do 
    lst=`ls /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/freshstart/${line}*.txt | awk -F'/' '{print $9}'` 
    ... 
done < /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/MatchedTumorTest.txt 

我在这里假设你将MatchedTumorTest.txt与新行分开。

+0

@克里斯它似乎有摆脱了原来的错误,但现在我得到了不同的错误。 – 2011-06-08 17:13:37

+0

qc-column-level-tumorTEST.sh:第104行:语法错误:文件意外结束 – 2011-06-08 17:14:16

+0

我不知道这是否与所做的更改有关;我会一直陪着它。 – 2011-06-08 17:14:54

1

如此地结合一起:

dir="/Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun" 
file="$dir/MatchedTumorTest.txt" 

< "$file" tr '\r' '\n' | while read tumor 
do 
    ls "$dir/freshstart" | grep "$tumor.*\.txt$" 
done 

将打印在$ DIR/freshstart所有的.txt文件名含有什么名字形成文件MatchedTumorTest.txt