for循环期间堆叠的文件名

时间:2011-06-08 16:49:40

标签: macos shell unix

我是shell脚本的新手,所以这可能是一个愚蠢的问题。我没有在网上找到答案。我正在采取同事脚本并更改它,以便它适用于我的数据。现在我正在运行一个仅使用三个数据文件的测试。代码在脚本中遇到一个位置,它通过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。

3 个答案:

答案 0 :(得分: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与换行符分开。

答案 1 :(得分:1)

看起来文本文件中的行可能由回车符而不是换行符分隔。由于示例中的文件名都没有空格,因此如果您像这样初始化forlisttumor循环应该可以正常工作:

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

tr命令会将回车符转换为换行符,这是大多数文本处理器(如命令所用的shell)所期望的,并将结果写入标准输出。

答案 2 :(得分: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的文件