次のようにタブ区切りのファイルがあります。
$ 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="..."