Как использовать строки в файле в качестве ключевого слова для grep? - PullRequest
0 голосов
/ 06 марта 2019

Я искал много вопросов здесь и на других сайтах, и люди предлагали вещи, которые должны решить мою проблему, но я думаю, что что-то не так с моим кодом, который я просто не узнаю.

У меня есть 24 файла .fasta из секвенирования NGS длиной 150 бп.Для каждого файла примерно 1 млн. Чтений.Чтения взяты из целевого секвенирования, где мы гальванизировали векторы с кДНК для генов, представляющих интерес, и уникальной последовательности штрих-кода.Мне нужно просмотреть файлы секвенирования на наличие или отсутствие последовательности штрих-кода, которая соответствует конкретному гену.

У меня есть список штрих-кодов .txt, который я хочу передать grep для поиска штрих-кода в файле .fasta.Я пробовал так много вариантов этой команды.Я могу задать grep для каждого штрих-кода в отдельности, но это отнимает много времени, и я знаю, что можно дать ему список последовательностей штрих-кодов, выполнить поиск каждого .fasta для каждого из штрих-кодов и записать, сколько раз каждый штрих-код находится в каждом файле.

Вот мой код, в котором я даю ему каждый штрих-код в отдельности:

# Barcode 33
mkdir --mode 755 $dir/BC33
FILES="*.fasta"
for f in $FILES;      do                      
cat "$f" | tr -d "\n" | tr ">" "\n" | grep 'TATTAGAGTTTGAGAATAAGTAGT' > $dir/BC33/"$f"
                      done

Я пытался адаптировать его, чтобы мне не приходилось вводить каждую последовательность штрих-кодов по отдельности:

dir="/home/lozzib/AG_Barcode_Seq/"
cd $dir
FILES="*.fasta"
for f in $FILES;      do                                              
cat "$f" | tr -d "\n" | tr ">" "\n" | grep -c -f BarcodeScreenSeq.txt | sort > $dir/Results/"$f"
echo "Finished $f"
                      done

Но он не ищет последовательности штрих-кодов.На этой итерации он просто возвращает новые файлы в каталоге /Results, которые пусты.Я также попробовал гнездовой цикл, где я попытался сделать последовательность штрих-кодов переменной, которая изменилась как $FILES, но это просто дало мне новый файл с именами моих файлов .fasta:

dir="/home/lozzib/AG_Barcode_Seq/"
cd $dir    
FILES="*.fasta"
for f in $FILES;      do                        
for b in `cat /home/lozzib/AG_Barcode_Seq/BarcodeScreenSeq.txt`; do                   
cat "$f" | grep -c "$b" | sort > $dir/"$f"_Barcode
                      done   ;
                      done    

Мне нужен выходной файл .txt, который имеет:

<barcode sequence>: <# of times that bc was found> 

для каждого файла .fasta, потому что я хочу собрать все образцы вместе, чтобы сделать один большой лист Excel, который показывает каждый штрих-код и сколько раз он былнайдено в каждом образце.

Пожалуйста, помогите, я перепробовал все, что мог придумать.

РЕДАКТИРОВАТЬ

Вот как будет выглядеть файл BarcodeScreenSeq.txt.Это просто текстовый файл, где каждая строка представляет собой последовательность штрих-кодов:

head BarcodeScreenSeq.txt 
TATTATGAGAAAGTTGAATAGTAG 
ATGAAAGTTAGAGTTTATGATAAG 
AATAGATAAGATTGATTGTGTTTG 
TGTTAAATGTATGTAGTAATTGAG 
ATAGATTTAAGTGAAGAGAGTTAT 
GAATGTTTGTAAATGTATAGATAG 
AAATTGTGAAAGATTGTTTGTGTA 
TGTAAGTGAAATAGTGAGTTATTT 
GAATTGTATAAAGTATTAGATGTG 
AGTGAGATTATGAGTATTGATTTA

EDIT

lozzib@gliaserver:~/AG_Barcode_Seq$ file BarcodeScreenSeq.txt
BarcodeScreenSeq.txt: ASCII text, with CRLF line terminators

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Концы строк в Windows

Ваш BarcodeScreenSeq.txt имеет оконечную строку. Каждая строка заканчивается специальными символами \r\n. Инструменты Linux, такие как grep, работают только с окончаниями строк linux \r и интерпретируют ваш файл ...

TATTATG\r\n
ATGAAAG\r\n
...

для поиска шаблонов TATTATG\r, ATGAAAG\r, ... (обратите внимание на \r в конце). Из-за \r совпадения нет.

Либо: Конвертируйте ваш файл, запустив dos2unix BarcodeScreenSeq.txt или sed -i 's/\r//g' BarcodeScreenSeq.txt. Это изменит ваш файл.
Или: заменить каждые BarcodeScreenSeq.txt в следующих сценариях на <(tr -d '\r' < BarcodeScreenSeq.txt). Это не изменит файл, но создаст дополнительные накладные расходы, так как файл конвертируется снова и снова.

Команда

grep -c имеет только один счетчик. Если вы пропустите несколько шаблонов поиска одновременно (например, с помощью -f BarcodeScreenSeq.txt), вы все равно получите только один номер для всех шаблонов вместе.

Для подсчета вхождений каждого шаблона в отдельности вы можете использовать следующий трюк:

for file in *.fasta; do
    grep -oFf BarcodeScreenSeq.txt "$file" |
    sort | uniq -c |
    awk '{print $2 ": " $1 }' > "Results/$file"
done

grep -o будет печатать каждое совпадение одной строкой.
sort | uniq -c будет подсчитывать, как часто встречается каждая строка.
awk только там, чтобы изменить формат с #matches pattern на pattern: #matches.

Преимущество: Команда должна быть достаточно быстрой.
Недостаток: Шаблоны из BarcodeScreenSeq.txt, которые не найдены в $file, не будут перечислены вообще. Ваш результат пропустит строки вида pattern: 0.

Если вам действительно нужны строки вида pattern: 0, вы можете использовать другой трюк:

for file in *.fasta; do
    grep -oFf BarcodeScreenSeq.txt "$file" |
    cat - BarcodeScreenSeq.txt |
    sort | uniq -c |
    awk '{print $2 ": " ($1 - 1) }' > "Results/$file"
done

cat - BarcodeScreenSeq.txt вставит содержимое BarcodeScreenSeq.txt в конце вывода grep, так что #matches будет на единицу больше, чем должно быть. Номер исправляется на awk.

0 голосов
/ 06 марта 2019

Вы можете прочитать текстовый файл по одной строке за раз и обработать каждую строку отдельно, используя перенаправление, например:

for f in *.fasta; do 
    while read -r seq; do
        grep -c "${seq}" "${f}" > "${dir}"/"${f}"_Barcode
    done < /home/lozzib/AG_Barcode_Seq/BarcodeScreenSeq.txt
done
...