나는 이것에 너무 많은 시간을 할애하여 제안을 찾고 있습니다. 너무 큰 파일 (관심있는 사람들을 위해 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입니다. 누구든지 내가 마지막 단계를 극적으로 빠르게 할 수있는 방법에 대한 제안이 있습니까?
각 헤더마다 하나의'grep'을 쓰는 대신, 파일 전체를 다시 스캔하고, 왜 모든 헤더를 파일에 넣고'grep -A3 -m1 -F -f header_list.txt FileA'를할까요? – twalberg
예, 문제는 -m1을 사용하면 첫 번째 히트 이후에 종료됩니다. – user3272284