キーワードを含む連続行を順番に選択

キーワードを含む連続行を順番に選択

次のようにタブ区切りのファイルがあります。

$ 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="..."

関連情報