두 파일을 일치시키고 [중복]을 필터링합니다.

두 파일을 일치시키고 [중복]을 필터링합니다.

파일이 두 개 있어요

파일 A

>TCONS_00000075 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAGCGCTACGGTC
CACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTTCCTCATCGAGCAGCAGCAAC
TCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACACGGCAACAACACTTTATACTTGTGTATAAT
>TCONS_00013830 gene=XLOC_006942
AAACACGGTTAGCTTGATATCACTGATGATCGATGGGATAGAGTCAGAGAACATCTTGTTCCTTAATTAT
CTCAATTCGTGAGATGTTGGACGATATCTCGATAGGGAGAGAAGGCGTTGTTCTGGATCATCACCGTGCT
CAGGGGTCAATTTTACACTGAGCAGGGGCAAAGACGTAAATTTTTACTTCCTTACTTGAGTAAGAGCAAG
TTTAATACTACAACCAACTACTACAAACTCCAATTCATTTATAACCAATCTAATAACTTATTCATACAAT
AGTTACCTATAAGCATATACTACACACACAACGTATTGGAATCCTCCGTGCTGCTGCTGGCTACAGATCT

문서 B

XLOC_000030
XLOC_000059
XLOC_000210

FileA는 FASTA 시퀀스 파일입니다. 로 시작하는 각 줄 >은 시퀀스 이름이고 그 아래 줄은 시퀀스입니다. FileB에 언급된 ID의 시퀀스를 추출하고 싶습니다. 이 경우:

파일C

>TCONS_00000075 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAGCGCTACGGTC
CACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTTCCTCATCGAGCAGCAGCAAC
TCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACACGGCAACAACACTTTATACTTGTGTATAAT

나는 다음 명령을 시도했습니다.

perl -pe 's/\n//; s/>(.*)/\n>$1\t/' A |grep -f <(awk '{print $1}' B) |sed 's/\t/\n/' | fold -w 60 > C

하지만 작동하지 않습니다.

답변1

팁: 데이터베이스 작업에는 데이터베이스 도구를 사용하세요.

검색 자체를 수행하는 대신 무언가를 찾는 메커니즘을 살펴보는 데 모든 시간을 소비하고 무언가를 찾는 명령이 , , perlsedawk조합 이고 grep모뎀 회선 잡음과 유사하기 시작한다면, 이제 생각해 볼 시간입니다. 그것실제 데이터베이스 도구 사용당신을 위한데이터 베이스맞춤 쿼리를 하나로 묶는 대신텍스트 처리도구.

유전자가 ('XLOC_000030', 'XLOC_000059', 'XLOC_000210') 위치한 RNA에서 *를 선택합니다.
사용하기가 훨씬 더 간단합니다.

즉, 일부 텍스트 처리 모뎀 회선 노이즈가 있습니다.

작업을 중복하지 마십시오.

데이터베이스를 레코드당 여러 행에서 레코드당 한 행으로 동적으로 변환하고 있습니다. 매번 쿼리하는 대신 한 번만 실행하세요. 한 사람은 Makefile이렇게 말했습니다.

플랫 키:A
        sed -e '/^>/s/$$/ /;:a;$$!N;s/\n //;ta;s/^>//;P;D' $^ >[이메일 보호됨]
        MV[이메일 보호됨]$@

make그런 다음 A뭔가 변경될 때마다 실행하세요. ( make이 줄의 시작 부분에 있는 공백 이 문자라는 점을 잊지 마십시오 TAB.)

프로그램 sed은 다음과 같습니다:

# 레코드의 첫 번째 줄에 공백을 추가합니다.
/^>/s/$$/ /
:ㅏ
# EOF가 아니면 가입
$!N
# 조인 줄이 공백으로 시작하는 경우 줄바꿈과 공백을 제거합니다.
s/\n //
# 그렇다면 반복하세요.
# 레코드 문자의 초기 시작을 제거합니다. 이제 개행 문자이기 때문입니다.
에/^>//
# 버퍼에서 전체 레코드를 인쇄하고 삭제합니다. 그런 다음 다시 시작하십시오.

문의

쿼리 명령이 너무 복잡해서 실제로는

grep -f B A. flat > C. flat

쿼리 출력을 여러 행으로 다시 변환하면 행 노이즈가 더 많이 발생합니다.

sed -e 's/^/>/' C.Flat|fold -s -w70|sed -e 's/^[^>]/ /' > C

중간 파일을 생략하면 다음이 제공됩니다.

grep -f B A.Flat|sed -e 's/^/>/'|fold -s -w70|sed -e 's/^[^>]/ /' > C

그리고 다시…

반복하자면 실제 데이터베이스 도구가 더 좋을 것입니다. 많은 수의 레코드가 있는 경우(이 질문과 다른 질문에서) 수행 중인 작업을 고려할 때 텍스트 처리 도구 방법을 사용하여 검색, 삽입 및 삭제하는 것은 매우 비효율적입니다. 실제 데이터베이스는필드 gene에 인덱스 만들기, 비교하면.

답변2

#!/bin/bash
while read line
do
        grep -A 1 $line filea >> filec
done < fileb

관련 정보