Grep은 파일에서 패턴을 검색하는 데 사용됩니다.

Grep은 파일에서 패턴을 검색하는 데 사용됩니다.

grep한 파일의 패턴을 두 번째 파일에서 검색하는 데 사용하고 싶습니다 . 내 스키마 파일은 다음과 같습니다.

K02217
K07448
KO8980

검색할 파일은 다음과 같습니다.

>aai:AARI_24510  proP; proline/betaine transporter; K03762 MFS transporter, MHS family, proline/betaine transporter
>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
>aai:AARI_28260  hypothetical protein
>aai:AARI_29060  ABC drug resistance transporter, inner membrane subunit; K09686 antibiotic transport system permease protein
>aai:AARI_29070  ABC drug resistance transporter, ATP-binding subunit (EC:3.6.3.-); K09687 antibiotic transport system ATP-binding protein
>aai:AARI_29650  hypothetical protein
>aai:AARI_32480  iron-siderophore ABC transporter ATP-binding subunit (EC:3.6.3.-); K02013 iron complex transport system ATP-binding protein [EC:3.6.3.34]
>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein

내가 시도한 명령은 다음과 같습니다.

fgrep --file=pattern.txt file.txt >> output.txt

그러면 패턴이 발견된 file.txt의 행이 인쇄됩니다. 발견된 패턴이 포함된 열을 인쇄하려면 이 정보가 필요합니다. 그래서 이렇게 :

K07448 mrr; restriction system protein Mrr; K07448 restriction system
K02217 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

누구든지 나에게 무엇을 해야할지 제안할 수 있나요?

답변1

추가 열이 있어도 괜찮다면 join및 를 사용하여 grep이 작업을 수행 할 수 있습니다.

$ join <(grep -of patterns.txt file.txt | nl) \
       <(grep -f patterns.txt file.txt | nl)
1 KO3322 proteinaseK (KO3322)
2 KO3435 Xxxxx KO3435;folding factor
3 KO3435 Yyyyy KO3435,xxxx

답변2

쉘 루프를 사용할 수 있습니다.

$ while read pat; do 
    grep "$pat" file | 
        while read match do 
            echo -e "$pat\t$match"
        done
 done < patterns 
KO3435  Xxxxx KO3435;folding factor
KO3435  Yyyyy KO3435,xxxx
KO3322  proteinaseK (KO3322)

저는 이것을 UniProt 휴먼 플랫 파일(625M)에서 실행하고 1000개의 UniProt ID를 패턴으로 사용하여 테스트했습니다. 내 Pentium i7 노트북에서는 약 6분 정도 걸립니다. 100개의 패턴만 검색했을 때는 35초 정도 걸렸습니다.


아래 설명에서 지적했듯이 및 옵션을 건너뛰고 echo사용 하면 작업 속도를 약간 높일 수 있습니다 .grep--label-H

$ while read pat; do 
    grep "$pat" --label="$pat" -H < file
done < patterns

샘플 파일에서 이 명령을 실행하면 다음이 생성됩니다.

$ while read pat; do 
    grep "$pat" --label="$pat" -H < kegg.annotations; 
  done < allKO.IDs.txt > test1
terdon@oregano foo $ cat test1 
K02217:>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
K07448:>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein

답변3

당신은 그것을 사용할 수 있습니다확인하다:

$ ack "$(tr '\n' '|' < pattern.txt | sed -e 's/.$//')" --print0 --output='$& $_' file.txt
KO3322 proteinaseK (KO3322)
KO3435 Xxxxx KO3435;folding factor
KO3435 Yyyyy KO3435,xxxx

관련 정보