我是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。
答案 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)
看起来文本文件中的行可能由回车符而不是换行符分隔。由于示例中的文件名都没有空格,因此如果您像这样初始化for
,listtumor
循环应该可以正常工作:
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的文件