문자열의 일부를 추출하는 가장 쉬운 방법은 무엇입니까?

문자열의 일부를 추출하는 가장 쉬운 방법은 무엇입니까?

다음과 같은 열이 있는 파일(bigfile.txt)이 있습니다.

NW_017095471.1  Gnomon  mRNA    108321  109565  .   +   .   ID=rna34;Parent=gene27;Dbxref=GeneID:108565285,Genbank:XM_017925071.1;Name=XM_017925071.1;gbkey=mRNA;gene=LOC108565285;model_evidence=Supporting evidence includes similarity to: 7 Proteins%2C and 100%25 coverage of the annotated genomic feature by RNAseq alignments%2C including 30 samples with support for all annotated introns;product=transmembrane protein 126A;transcript_id=XM_017925071.1
ID=gene27;Dbxref=GeneID:108565285;Name=LOC108565285;gbkey=Gene;gene=LOC108565285;gene_biotype=protein_coding
ID=gene28;Dbxref=GeneID:108569527;Name=LOC108569527;gbkey=Gene;gene=LOC108569527;gene_biotype=protein_coding
ID=gene78;Dbxref=GeneID:108562956;Name=LOC108562956;gbkey=Gene;gene=LOC108562956;gene_biotype=protein_coding

별도의 목록이 있습니다.

gene27
gene28

각 행을 가져오고 ID 필드에 대해 grep을 수행하고 "Name=" 뒤에 "LOC#"을 반환하고 싶습니다.

gene=$line
`grep $gene";" bigfile.txt | sed -e 's/Name=

반품

LOC108565285
LOC108569527

이 부분을 어떻게 추출할 수 있나요?

답변1

이것이 탭으로 구분된 9번째 필드라고 가정해 보겠습니다.GFF 파일gene(속성 필드) 다음을 사용하여 특정 속성(별도의 파일에서 읽음)에 해당하는 속성 값을 추출할 수 있습니다 .IDawk

BEGIN { FS = "\t" }

FNR == NR {
    # Read IDs into a hash as keys.
    ids[$1] = 1
    next
}

$3 == "gene" {
    # Split the attribute field into separate key-value pairs.
    n = split($9, keyvalues, ";")

    id = ""    # Not found a gene ID yet
    gene = ""  # No gene name to print

    # Loop over the key-value pairs, split them on the "="
    # and extract the gene name and gene ID.
    for (i = 1; i <= n; ++i) {
        split(keyvalues[i], attr, "=")
        if (attr[1] == "ID") {
            if (attr[2] in ids)
                id = attr[2]
            else
                next  # This line is not of interest
        }
        else if (attr[1] == "gene")
            gene = attr[2]
    }

    if (id != "" && gene != "")
        print gene
}

file.gff열 9에 지정된 데이터와 다음 위치에 있는 유전자 ID 목록을 포함하는 GFF 파일에서 이를 실행합니다 id.list.

$ awk -f script.awk id.list file.gff
LOC108565285
LOC108569527

유전자 ID 목록은 FNR == NR코드 블록의 첫 번째 파일에서 읽히는 awk반면, 마지막 블록은 명령줄에 제공된 두 번째(및 모든 후속) 파일에 있는 유전자 특징 줄의 속성 필드를 처리합니다.

코드 awk에서는 GFF 파일 IDgene속성에 단일 값만 포함되어 있고(쉼표로 구분된 값 목록이 아님) 해당 값이 인용되지 않은 것으로 가정합니다.

유전자 이름 및 유전자 ID 목록(두 개의 열)으로 출력하려면 명령문을 print gene로 변경하십시오 print id, gene.

답변2

이를 위해서는 리팩토링이 필요하지만 원하는 작업을 수행해야 합니다.

while IFS=; read -r line; do grep -Fw "$line" biffile.txt; done < other_file | awk -F';' '{split($3,a,"=");print a[2]}'

답변3

나는 약간 다른 접근법을 사용할 것입니다. 먼저 ID 및 이름 필드만 추출합니다.

$ sed -nE 's/.*ID=([^;]*).*Name=([^;]*).*/\1 \2/p' file1
gene27 LOC108565285
gene28 LOC108569527
gene78 LOC108562956

그런 다음 대상 ID 목록을 사용하여 필터링합니다.

$ cat file2
gene27
gene28
$ sed -nE 's/.*ID=([^;]*).*Name=([^;]*).*/\1 \2/p' file1 | grep -wf file2 
gene27 LOC108565285
gene28 LOC108569527

또는 값만 원 LOC....하고 GNU가 있다고 가정하는 경우 grep:

$ grep -wf file2 file1 | grep -oP 'Name=\K[^;]+'
LOC108565285
LOC108569527

답변4

아래의 간단한 스크립트로 완료

주문하다

for i in `cat file2`; do awk -v i="$i" -F ";" '$1=="ID="i{print $5}' file1| awk -F  "=" '{print $NF}'; done

산출

LOC108565285
LOC108569527

관련 정보