Выбор случайного чтения из пары чтений в файле fastq

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

То, что я сделал до сих пор, это...

Я пробовал свои файлы, используя seqtk:

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

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

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

Я сделал то же самое с 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

а потом каким-то образом выбрать чтение, соответствующее номеру, который я получил от 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  

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


person mzenson    schedule 02.06.2016    source источник
comment
Скрипты решили вашу проблему?   -  person Maximilian Peters    schedule 20.06.2016


Ответы (1)


Вы можете попробовать следующий скрипт (он также работает как один лайнер). Сначала он получает все заголовки из вашего первого файла 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
person Maximilian Peters    schedule 03.06.2016