2014-05-21 9 views
0

나는 이것에 너무 많은 시간을 할애하여 제안을 찾고 있습니다. 너무 큰 파일 (관심있는 사람들을 위해 Illumina 시퀀싱을 실행하는 FASTQ 파일)이 있습니다. 내가해야 할 일은 두 파일 사이의 패턴을 일치시키고 그 라인과 그 아래 3 줄을 중복되지 않은 두 개의 별도 파일 (원본 파일에 있음)로 인쇄하는 것입니다. Grep은이 작업을 훌륭하게 수행하지만 파일은 ~ 18GB이며 일치 작업은 매우 느립니다. 내가해야 할 일의 예가 아래와 같습니다.매우 큰 파일 간의 그렙 패턴 일치가 너무 느립니다.

FileA와 :

@DLZ38V1_0262:8:1101:1430:2087#ATAGCG/2 
GAAATCAATGGATTCCTTGGCCAGCCTAGCCGGAGTGCCTGTTTTCAAAC 
+DLZ38V1_0262:8:1101:1430:2087#ATAGCG/2 
_[_ceeeefffgfdYdffed]e`gdghfhiiihdgcghigffgfdceffh 
@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
GCCATTCAGTCCGAATTGAGTACAGTGGGACGATGTTTCAAAGGTCTGGC 
+DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
_aaeeeeegggggiiiiihihiiiihgiigfggiighihhihiighhiii 
@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
GCCATTCAGTCCGAATTGAGTACAGTGGGACGATGTTTCAAAGGTCTGGC 
+DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
_aaeeeeegggggiiiiihihiiiihgiigfggiighihhihiighhiii 
@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
GCCATTCAGTCCGAATTGAGTACAGTGGGACGATGTTTCAAAGGTCTGGC 
+DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
_aaeeeeegggggiiiiihihiiiihgiigfggiighihhihiighhiii 

4 헤더가 있습니다

@DLZ38V1_0262:8:1101:1430:2087#ATAGCG/1 
NTTTCAGTTAGGGCGTTTGAAAACAGGCACTCCGGCTAGGCTGGTCAAGG 
+DLZ38V1_0262:8:1101:1430:2087#ATAGCG/1 
BP\cccc^ea^eghffggfhh`bdebgfbffbfae[_ffd_ea[H\_f_c 
@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/1 
NAGGATTTAAAGCGGCATCTTCGAGATGAAATCAATTTGATGTGATGAGC 
+DLZ38V1_0262:8:1101:1369:2106#ATAGCG/1 
BP\ccceeggggfiihihhiiiihiiiiiiiiihighiighhiifhhhic 
@DLZ38V1_0262:8:2316:21261:100790#ATAGCG/1 
TGTTCAAAGCAGGCGTATTGCTCGAATATATTAGCATGGAATAATAGAAT 
+DLZ38V1_0262:8:2316:21261:100790#ATAGCG/1 
__\^c^ac]ZeaWdPb_e`KbagdefbZb[cebSZIY^cRaacea^[a`c 

당신은

이 FileB 3 고유의 헤더를 추가로 3 선

다음 @로 시작 볼 수 있습니다 이리 하지만 그 중 하나가 3 번 반복되면서 2 개만이 중복됩니다.

두 개의 파일 사이에 공통 헤더가 필요합니다. 각 파일에서 같은 순서로.

는 여기에 지금까지이 작업은 다음과 같습니다

grep -E @DLZ38V1.*/ --only-matching FileA | sort -u -o FileA.sorted 
grep -E @DLZ38V1.*/ --only-matching FileB | sort -u -o FileB.sorted 
comm -12 FileA.sorted FileB.sorted > combined 

이 중복없이 두 파일 사이의 유일한 공통의 헤더입니다

@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/ 
@DLZ38V1_0262:8:1101:1430:2087#ATAGCG/ 

을 결합했다. 이것이 내가 원하는거야. 이제이 헤더를 원본 파일과 일치시켜야하고 그 아래에있는 3 줄을 한 번만 가져와야합니다. 내가 GREP을 사용하는 경우

나는 FileA.Final 각 파일

while read -r line; do 
    grep -A3 -m1 -F $line FileA 
done <combined> FileA.Final 

내가 원하는 것을 얻을 수

@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/1 
NAGGATTTAAAGCGGCATCTTCGAGATGAAATCAATTTGATGTGATGAGC 
+DLZ38V1_0262:8:1101:1369:2106#ATAGCG/1 
BP\ccceeggggfiihihhiiiihiiiiiiiiihighiighhiifhhhic 
@DLZ38V1_0262:8:1101:1430:2087#ATAGCG/1 
NTTTCAGTTAGGGCGTTTGAAAACAGGCACTCCGGCTAGGCTGGTCAAGG 
+DLZ38V1_0262:8:1101:1430:2087#ATAGCG/1 
BP\cccc^ea^eghffggfhh`bdebgfbffbfae[_ffd_ea[H\_f_c 

루프는 FileB.Final

를 생성하는 반복하면서
@DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
GCCATTCAGTCCGAATTGAGTACAGTGGGACGATGTTTCAAAGGTCTGGC 
+DLZ38V1_0262:8:1101:1369:2106#ATAGCG/2 
_aaeeeeegggggiiiiihihiiiihgiigfggiighihhihiighhiii 
@DLZ38V1_0262:8:1101:1430:2087#ATAGCG/2 
GAAATCAATGGATTCCTTGGCCAGCCTAGCCGGAGTGCCTGTTTTCAAAC 
+DLZ38V1_0262:8:1101:1430:2087#ATAGCG/2 

작동하지만 FileA와 FileB는 ~ 18GB이고 결합 된 파일은 ~ 2GB입니다. 누구든지 내가 마지막 단계를 극적으로 빠르게 할 수있는 방법에 대한 제안이 있습니까?

+0

각 헤더마다 하나의'grep'을 쓰는 대신, 파일 전체를 다시 스캔하고, 왜 모든 헤더를 파일에 넣고'grep -A3 -m1 -F -f header_list.txt FileA'를할까요? – twalberg

+0

예, 문제는 -m1을 사용하면 첫 번째 히트 이후에 종료됩니다. – user3272284

답변

1

생각해 보았던 문제를 게시해야합니다. 위의 결합 된 파일을 얻은 후에는 perl 해시 참조를 사용하여 메모리로 읽어 들이고 파일 A를 검색했습니다. 파일 A의 일치가 해시되어 파일 B를 검색하는 데 사용되었습니다.이 작업은 여전히 ​​많은 메모리를 필요로하지만 매우 빠르게 작동합니다. grep을 사용한 20 일 이상 ~ 20 분.

1

이 실행해야 얼마나 자주 수행에 따라 : 포스트 그레스 (? sqlite가) 데이터베이스로 데이터 (당신은 아마 대량 이후에 내장 된 인덱스 삽입을 할 것입니다)

  1. 당신이 덤프 수를, 여기에 대한 색인을 작성하고 40 년 동안의 연구를 통해 얻은 성과를 바탕으로 실제적으로 투자가 필요없는 관계형 데이터베이스를 효율적으로 구현할 수 있습니다.

  2. 당신은 유닉스 유틸리티 'join'을 사용하여 관계형 데이터베이스를 모방 할 수 있지만 인덱스가 없으므로 기쁨이별로 없지만 'grep'보다 빠를 가능성이 높습니다. ', 당신은 신체적 한계에 부딪 힐 수도 있습니다 ... 나는 결코 두 개의 18G 파일에 합류하려하지 않았습니다.

  3. 당신은 문자열 (4 글자, 맞습니까?)을 바이너리로 변환하고 인덱스 (또는 그 이상)를 기반으로하는 C 코드 (여기에 컴퓨터 코드로 컴파일 된 언어)를 작성할 수 있습니다. 그 위에. 50 개의 문자열이 2 개의 64 비트 단어만을 차지하므로 번개처럼 빠른 메모리 공간을 차지할 수 있습니다.