awk 또는 sed를 사용하여 특정 패턴의 부분 행을 추출하고 새 필드에 저장

awk 또는 sed를 사용하여 특정 패턴의 부분 행을 추출하고 새 필드에 저장

내 문제는 다음과 비슷합니다이것, 그러나 추출하려는 부분이 해당 행 내에 있으므로 출력이 아닌 원본 파일의 새로 생성된 열에도 저장하고 싶습니다.

탭으로 구분된 파일의 한 줄은 다음과 같습니다.

chr1    25228613        25229157        CDS     HAVANA  .       -       2       ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig

$9에서 "gene_name" 이후의 내용을 추출하고 싶습니다. 이 줄은 RUNX3입니다.

예상 출력:

chr1    25228613        25229157        CDS     HAVANA  .       -       2       ID=CDS:ENST00000338888.3;Parent=ENST00000338888.3;gene_id=ENSG00000020633.18_3;transcript_id=ENST00000338888.3_2;gene_type=protein_coding;gene_name=RUNX3;transcript_type=protein_coding;transcript_name=RUNX3-202;exon_number=7;exon_id=ENSE00001384103.2;level=2;protein_id=ENSP00000343477.3;transcript_support_level=1;tag=basic,appris_alternative_2,CCDS;ccdsid=CCDS30633.1;havana_gene=OTTHUMG00000003316.1_3;havana_transcript=OTTHUMT00000009285.1_2;remap_original_location=chr1:-:24902122-24902666;remap_status=full_contig    RUNX3

awk나 sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

이제 구분 기호를 알았으니 해당 구분 기호를 분할하고 다시 그룹화하세요.

sed -Ei 's/(.*gene_name=)([^;]*)(;.*)/\1\2\3\t\2/g' gene

으로 나누어져 있어요

(.*gene_name=)

gene_name 태그까지의 모든 문자열은 변수 1에 들어갑니다.

([^;]*)

; 변수 2에 들어가기 전의 모든 연속 문자

(;.*)

문자열의 나머지 부분은 변수 3에 들어갑니다.

\1\2\3\t\2

탭과 추가된 유전자를 사용하여 문자열을 재조립합니다.

편집하다

아니면 @Weijun이 말했듯이

\0\t\2

다른 편집자

코드 골프

sed -Ei 's/.*gene_name=([^;]*).*/\0\t\1/g' gene

답변2

그리고 gawk:

gawk 'match($9,/^.*gene_name=([^;]*);.*/,arr) {print $0"\t"arr[1]}'

그러면 "gene_name=" 문자열이 포함된 각 줄의 끝에 gene_name이 추가됩니다. 필요에 따라 세부적으로 조정할 수 있습니다.

답변3

다음 내용 awk도 도움이 될 수 있습니다.

awk '{val=$0;sub(/.*gene_name=/,"",val);sub(/\;.*/,"",val);print $0,val}' Input_file

답변4

awk다음은 파일의 속성 필드(탭으로 구분된 9번째 필드)에서 특정 이름의 필드를 구문 분석하는 일반적인 솔루션 입니다.일반 기능 형식(GFF):

BEGIN { OFS = FS = "\t" }

function get_attrib_by_name(key,  n,attrib,kv) {
    # Split the attribute field on semi-colons.
    n = split($9, attrib, ";")

    # Loop over the attributes and split each on "=".
    # When we've found the one we're looking for (by key name in "key"),
    # return the corresponding value.
    for (i = 1; i <= n; ++i) {
        split(attrib[i], kv, "=")
        if (kv[1] == key) {
            return kv[2]
        }
    }
}

# Using the above function.
{
    name = get_attrib_by_name("gene_name")
    print $0, name
}

이것은 다음과 같이 사용될 것입니다

$ awk -f script.awk file.gff

script.awk위의 스크립트는 어디에 있습니까?

관련 정보