키워드가 포함된 연속 라인을 순서대로 선택

키워드가 포함된 연속 라인을 순서대로 선택

다음과 같이 탭으로 구분된 파일이 있습니다.

$ cat file
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011558474.1  1159543 1160595 -4330977        polyketide synthase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011558475.1  1160607 1161116 12      isoprenylcysteine carboxyl methyltransferase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011558476.1  1161113 1162129 -3      NAD(P)/FAD-dependent oxidoreductase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011559726.1  2496640 2497560 1334511 polyketide synthase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011559727.1  2497568 2498122 8       isoprenylcysteine carboxyl methyltransferase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011562574.1  5526997 5528142 3028875 NAD(P)/FAD-dependent oxidoreductase [Mycobacterium]

꼭 뽑아야 해요연속된 줄키워드 "폴리케타이드 신타제", "메틸트랜스퍼라제" 및 "산화환원효소"가 포함되어 있습니다.그와 같은 순서로, 추가 분석을 위해 각 컬렉션을 별도의 파일에 기록합니다.

이 경우 입력 파일은 다음과 같이 2개의 출력 파일을 생성합니다.

$ cat file_1
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011558474.1  1159543 1160595 -4330977        polyketide synthase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011558475.1  1160607 1161116 12      isoprenylcysteine carboxyl methyltransferase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011558476.1  1161113 1162129 -3      NAD(P)/FAD-dependent oxidoreductase [Mycobacterium]

$ cat file_2
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011559726.1  2496640 2497560 1334511 polyketide synthase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011559727.1  2497568 2498122 8       isoprenylcysteine carboxyl methyltransferase [Mycobacterium]
GCF_000015405.1_ASM1540v1.dist_nbr_anntn        WP_011562574.1  5526997 5528142 3028875 NAD(P)/FAD-dependent oxidoreductase [Mycobacterium]

awk를 사용하여 이 작업을 수행하는 데 문제가 있습니다. 어떤 제안이 있으십니까?

폴리스티렌연속된 줄에 다양한 수의 키워드 인스턴스가 포함된 다른 입력 파일이 있습니다. 이것이 내가 막히는 곳입니다.

답변1

스크립트가 진행됨에 따라 검색할 항목을 변경할 수 있으며 용어가 순환될 때마다 기록되는 위치를 변경할 수 있습니다.

awk 'BEGIN {
    result_file = 1;
    term_id = 1;
    search_terms[1] = "polyketide synthase";
    search_terms[2] = "methyltransferase";
    search_terms[3] = "oxidoreductase"
}
$0 ~ search_terms[term_id] { 
    print $0 >> FILENAME "_" result_file;
    term_id = term_id + 1;
    if (term_id > 3) {
        result_file =  result_file + 1;
        term_id = 1
    }
}' input_file

input_file_1이 내용은 , input_file_2... 에 작성됩니다 .

답변2

awk키워드를 요소 이름을 딴 배열 로 분할하는 다음 코드를 테스트할 수 있습니다 . 모든 것은 키[1]로 시작합니다. 다음 1개 행이 키[2에서 N으로 인덱싱됨]의 해당 값과 일치하는지 확인하는 플래그를 설정합니다. 행 N-1 이전의 불일치는 해당 행이 해당 플래그를 재설정합니다. 도달하면 모든 것이 출력에 맞습니다(여기서 flag=0도 재설정하므로 flag==1을 사용한 연속 실행은 줄 수를 초과하지 않습니다).keysNN-1N-1N-1

$ cat t24.awk
BEGIN{ 
    FS = OFS = "\t";
    keywords = "polyketide synthase,methyltransferase,oxidoreductase";
    N = split(keywords, keys, ",")
}

# flag==1 means we are doing regex_match the next N-1 lines
# against corresponding array element in keys from [2:N] 
# once a unmatched found, turn off flag immediately
# if the flag==1 reached N-1 lines, then print the good match
flag {
    if($NF ~ keys[NR - start_line + 1]) {
        F = F ORS $0;
        if (NR == start_line+N-1) {print F > "out_" f++; flag = 0 }
        next
    } else {
        flag = 0;
    }
}

# set up the flag/start_line and reset F
$NF ~ keys[1] { flag = 1; F = $0; start_line= NR; }

위의 코드를 사용하여 실행합니다 awk -f t24.awk file.txt. 블록에 하드코딩하는 keywords대신 셸에서 설정(쉼표로 구분) 하고 사용하여 더욱 유연하게 만들 수 있습니다.BEGIN-v keywords="..."

관련 정보