2011-06-08 78 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