2016-06-02 3 views
1

У меня есть вопрос о случайном выборе чтения из выборочных файлов fastq с парным концом. Я прочитал несколько тем по этому поводу, но никто не смог решить мою проблему: Я получил два файла fastq R1.fastq и R2.fastq. Я хочу добиться случайного отбора этих файлов, и из каждой выборочной пары считываний я хочу случайным образом выбрать только одно чтение.Выбор случайного чтения из пары считываний в файле fastq

То, что я до сих пор есть ...

Я пробовал свои файлы с помощью seqtk:

seqtk sample -s100 R1.fastq 10000 > R1_sample.fastq 
seqtk sample -s100 R2.fastq 10000 > R2_sample.fastq 

я отсортирован каждый файл по последовательности ID так:

paste - - - - < R1_sample.fastq | sort -k1 -t " " | tr "\t" "\n" > R1_sample_sorted.fastq 

I сделал то же самое с R2_sample.fastq. Тогда я слился как отсортированные файлы, так что R1 будет находиться в одном столбце и R2 во втором столбце:

pr -mts R1_sample_sorted.fastq R2_sample_sorted.fastq > merged.fastq 

файл выглядит так:

@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000 
TGATGTTTGGATGTAAAGTGAAATATTAGTTGGCG AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAA 
+     + 
BBBFFFFFFFFFFFIFFIFFIIIIFIIIFIIFIII B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000 
CCTCCTAGGCGACCCAGACAATTATACCCTAGCCA TGTTTAAGGGGTTGGCTAGGGTATAATTGTCTGGG 
+     + 
BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII BBBFFFFFFFFFFIIIIIIIIBFFIIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000 
TTCTATTTATTACCTCAGAAGTTTTTTTCTTCGCA GTAAAAGGCTCAGAAAAATCCTGCGAAGAAAAAAA 
+     + 
BBBFFFFFFFFFFIIIIIIIIFIIFIIIFIIIIII BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII 

А теперь я хочу, чтобы случайно выбрать только один читать с каждой пары. Моя первоначальная идея состояла в том, чтобы использовать SHUF, чтобы получить случайное число из диапазона 1-2:

shuf -i1-2 -n1 

, а затем каким-то образом выбрать для чтения cooresponding на номер я получил от SHUF. Например, на первой итерации я получил 1, поэтому я выбираю чтение из столбца 1, в итерации соседей у ​​меня получилось 2, поэтому из следующей пары считываний я выбираю чтение во второй колонке и т. Д.

Я застрял здесь , Поэтому мой вопрос: есть ли опрятный способ сделать это? Может быть, с awk или другим методом? Любая помощь будет очень оценена.

Комментарий Ashafixs ответ:
Спасибо за ваш отвечают и извините за огромную задержку ...! Я протестировал ваши решения, и у них обоих есть недостатки.
Для первого скрипта я построил тестовые файлы fastq R1 и R2, каждый из которых содержит 6 прочтений. После запуска скрипта я ожидаю, что он также выведет 6 файлов (24 строки) в правильном порядке (ID, seq, desc, qual), но как набор считываний, случайным образом выбранных из файлов R1 или R2. Что я получил от сценария:

@D3YGT8Q1:297:C7T4RACXX:3:1101:10002:27381 2:N:0:ATGCTCGTTCTCTCGT 
AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCAAGATC 
+ 
B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIFIFIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10007:32152 1:N:0:ATGCTCGTTCTCTCGT 
GTAAGGTTAGGAGGGTGTTAATTATTAAAATTAAGGCGAAGTTTATTACTCTTTTTTGAATGTTG 
+ 
BBBFFFFFFFFFFIIBFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFFFFFFFF 

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

Для второго скрипта я ввожу объединенный файл fastq, как описано выше. Выход выглядит аналогично первому выходному сценарию:

@D3YGT8Q1:297:C7T4RACXX:3:1101:10002:27381 2:N:0:ATGCTCGTTCTCTCGT 
AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCAAGATC 
+ 
B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIFIFIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT 
TGTTTAAGGGGTTGGCTAGGGTATAATTGTCTGGGTCGCCTAGGAGGAGATCGGAAGAGCGTCGT 
+ 
BBBFFFFFFFFFFIIIIIIIIBFFIIIIIIIIIIIFFFIIIIIIFIIIIIFIIIFFFFFFFFFFF 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:88140 1:N:0:ATGCTCGTTCTCTCGT 
ACTGTAACTTAAAAATGATCAAATTATGTTTCCCATGCATCAGGTGCAATGAGAAGCTCTTCATC 
+ 
BBBFFFFFFFFFFIIIIIIIIIIFIIIIIIFIIIIIIIIIIIIIFIIIIIIIIIIIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10007:32152 2:N:0:ATGCTCGTTCTCTCGT 
CTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTAATAATTAACACCCTC 
+ 
BBBFFFFFFFFFFIIIIIIIIIIIIIIFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIII 

, но на этот раз я всегда получаю пять раз. Все еще отсутствует. И второй и третий считывающие заголовки одинаковы. Этого не должно быть.

+0

Были ли сценарии решают вашу проблему? –

ответ

0

Вы можете попробовать следующий скрипт (он также работает как один лайнер). Сначала он получает все заголовки из вашего первого файла fastq, затем он случайно выбирает файл fastq и возвращает из него 4 строки. Обратите внимание: это работает только в том случае, если оба файла имеют одинаковые заголовки в одинаковых положениях.

#!/bin/bash 
headers=$(grep @ R1_sample.fastq) 
var=1 
for line in $headers ; do 
    r=$(shuf -i1-2 -n1) 
    tail -n +$var "R$r"_sample.fastq | grep -m 1 -A 4 $line 
    var=$((var+4)) 
done 

В качестве альтернативы вы можете расширить слияния и выбрать подход столбца. cut используется для удаления случайного столбца из объединенного вывода.

#!/bin/bash 
headers=$(grep @ merged.fastq) 
var=1 

for line in $headers ; do 
    r=$(shuf -i1-2 -n1) 
    tail -n +$var merged.fastq | grep -m 1 -A 4 $line | cut -d$'\t' -f$r 
    var=$((var+4)) 
done