다음과 같이 탭으로 구분된 파일이 있습니다.
$ 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을 사용한 연속 실행은 줄 수를 초과하지 않습니다).keys
N
N-1
N-1
N-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="..."