2015-10-12 4 views
0

У меня есть большой файл (.fastq), где 1,6 Гб каждая запись четыре строки, где новая запись начинается в строке, которая начинается с @:Удаление нескольких строк на основе совпадений между двумя отдельными файлами

@SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35 
GATGGTAGAAACATACGTCTT 
+SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35 
IIIIIIIIIIIIIIIIIIIII 
@SRR392137.2 I331_3_FC302WFAAXX:3:1:163:1931 length=35 
GAATCATTTTGATAATAATAAGTTC 
+SRR392137.2 I331_3_FC302WFAAXX:3:1:163:1931 length=35 
IIIIIIIIIIIIIIIIIIIIIIIII 
@SRR392137.4 I331_3_FC302WFAAXX:3:1:164:1938 length=35 
GACGGGTGAGTAACGCGTAAGAAC 
+SRR392137.4 I331_3_FC302WFAAXX:3:1:164:1938 length=35 
IIIIIIIIIIIIIIIIIIIIIIII 
@SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35 
GATGGTTTTGTCTGCTTAGATC 
+SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35 
IIIIIIIIIIIIIIIIIIIIII 

у меня есть второй файл со списком идентификаторов (500,000 в общей сложности), которые должны быть удалены из файла .fastq:

@SRR392137.2 
@SRR392137.4 

Это будет включать в себя удаление строки, содержащей строку и следующие 3 строки внизу так, что выходной файл будет содержать:

@SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35 
GATGGTAGAAACATACGTCTT 
+SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35 
IIIIIIIIIIIIIIIIIIIII 
@SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35 
GATGGTTTTGTCTGCTTAGATC 
+SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35 
IIIIIIIIIIIIIIIIIIIIII 

Есть ли способ сделать это с помощью grep, sed или awk?

Спасибо.

ответ

0
#!/usr/bin/awk -f 
BEGIN { 
    RS = "@" 
} 
NR == FNR { 
    z[$1] 
    next 
} 
$1 in z { 
    next 
} 
{ 
    printf RS $0 
} 

Run так:

alpha.awk list.ids large.fastq 

Или

awk 'NR==FNR {z[$1];next} $1 in z {next} {printf RS$0}' [email protected] list.ids large.fastq 
+0

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

+0

У меня есть ошибка в больших файлах, которые всегда останавливаются на одной и той же записи. Я полагаю, потому что он содержит @. Есть ли способ, чтобы изменить код, чтобы принять это во внимание @ SRR392137.1854 I331_3_FC302WFAAXX: 3: 1: 451: 470 длина = 35 GAGAGAATATAGGATGGGTACCAT + SRR392137.1854 I331_3_FC302WFAAXX: 3: 1: 451: 470 = длина 35 IIIIIIIIIIIIII @ II & I:% $$ + – catcha

+0

@catcha Я не двигаюсь с помощью стойки ворот –

1

Для выпуска памяти и использования unhopefully трубы

grep -v -f ListToExclude.file file.fastq \ 
| sed -u -e '/^@/!d' -e 'N;N;N' 
  • Grep удалить запись линия из вашего списка, чтобы удалить
  • The sed удалить строку, начинающуюся не с @. Если начать с @, он также включает в себя следующие 3 строки для вывода
    • -u использовать небуферизованные варианты, ПОЛЕЗНЫЙ в этом случае
Смежные вопросы