패턴 검색 및 다른 파일에 줄 추가

패턴 검색 및 다른 파일에 줄 추가

다음과 같은 파일이 있습니다(5개의 탭으로 구분된 열).

head allKO.txt
Metabolism Carbohydrate metabolism Glycolisis K07448
Metabolism Protein metabolism protesome K02217

파일의 5번째 열에서 패턴(문자열)을 검색하고, 발견되면 패턴이 발견된 줄과 모든 열을 KEGG.annotations다른 파일에 인쇄하고 싶습니다 . 패턴을 찾고 있는 파일은 다음과 같습니다.KEGG.annotationsallKO.txt

head KEGG.annotations
>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

나는 다음과 같은 것을 원합니다 :

Metabolism Carbohydrate metabolism Glycolisis K07448 >aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system
Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

첫 번째 행에 추가 된 >aai:AARI_33320 mrr; restriction …텍스트는 8번째 행이며 여기에는 첫 번째 행(5번째 필드)의 ID 필드가 KEGG.annotations포함됩니다 .K07448allKO.txt

내 스키마 파일을 사용하려면 이 코드를 어떻게 수정해야 합니까? 이는 찾고 있는 특정 패턴을 포함하는 열이 하나만 있는 패턴 파일에 적용됩니다.

while read pat; do
    grep "$pat" --label="$pat" -H < KEGG.annotations;
done < allKO.txt > test1

답변1

기존 코드를 사용할 수 있습니다. 행을 배열에 저장하고 다섯 번째 요소와 일치시킵니다.

while read -r line; do
    [ -z "$line" ] && continue
    patlist=($line)
    pat=${patlist[4]}
    grep "$pat" --label="$line" -H < KEGG.annotations
done < allKO.txt

반품:

Metabolism Carbohydrate metabolism Glycolisis K07448:>aai:AARI_33320  mrr; restriction system protein Mrr; K07448 restriction system protein
Metabolism Protein metabolism protesome K02217:>aai:AARI_26600  ferritin-like protein; K02217 ferritin [EC:1.16.3.1]

답변2

이는 귀하의 요구 사항을 충족하는 것 같습니다.

while read w1 w2 w3 w4 ID
do
    printf "%s " "$w1 $w2 $w3 $w4 $ID"
    if ! grep "$ID" KEGG.annotations
    then
        echo
    fi
done < allKO.txt

그러면 화면에 출력이 기록됩니다. 파일에 출력을 캡처하려면 마지막 줄에 출력( >) 리디렉션(예: )을 추가합니다.> test1

  • 귀하의 예에 따르면 키/ID 필드("스키마")는 다음과 같습니다.다섯~의다섯필드가 탭으로 구분된 파일이라고 말씀 allKO.txt하셨습니다 read w1 w2 w3 w4 ID. 모든 필드에 공백이 없다고 가정합니다.
  • 끝에 공백이 있지만 종료되는 줄 바꿈이 없는 줄 printf(즉, 필드)을 작성( )하세요.allKO.txt
  • grep( ) 파일 에서 KEGG.annotationsID( from 행의 다섯 번째 필드)를 검색합니다 allKO.txt. 이는 완전한 라인(개행 포함)입니다.
  • grep실패 하면 printf줄 바꿈이 없기 때문에 개행을 작성하십시오.
  • 이렇게 하면 존재하지 않는 ID가 있는 행이 KEGG.annotations 단순히 출력에 기록됩니다.

    Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    This ID doesn’t exist: K99999
    

    그리고 여러 번 존재하는 ID는 데이터를 반복하지 않고 추가 행에 기록됩니다 allKO.txt.

    Metabolism Protein metabolism proteasome K02217  >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
    This is a hypothetical additional line from KEGG.annotations that mentions “K02217”.
    

관련 정보