Стабилизация имен файлов во время цикла for - PullRequest
0 голосов
/ 08 июня 2011

Я новичок в сценарии оболочки, так что это может быть глупый вопрос.Я не нашел ответа в Интернете, хотя.Я беру скрипт сотрудника и изменяю его так, чтобы он работал для моих данных.Сейчас я запускаю тест, который использует только три моих файла данных.Код попадает в сценарий, где проходит цикл 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

По какой-то причине все имена файлов накладываются друг на друга вместо цикла, идущего к каждому по отдельности.Есть идеи, почему это происходит?

Спасибо, TJ

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Похоже, что строки в вашем текстовом файле могут быть разделены символами возврата каретки вместо новых строк.Поскольку ни одно из имен файлов в вашем примере не имеет пробелов, цикл for должен работать очень хорошо, если вы инициализируете свой listtumor следующим образом:

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

Команда tr переведет возврат кареткив переводы строк, чего ожидают большинство текстовых процессоров (например, собственные команды оболочки для команды), и записывает результат в стандартный вывод.

1 голос
/ 09 июня 2011

Итак, все вместе:

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

напечатает все имена файлов .txt в каталоге $ dir / freshstart, которые содержат имя из файла MatchedTumorTest.txt

1 голос
/ 08 июня 2011

Цикл 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 символом новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...