連続パターンの発生回数を計算する方法

連続パターンの発生回数を計算する方法

3つの列を持つファイルがあります。列3には次の遺伝子名が含まれています。

Rv0729,Rv0993,Rv1408  
Rv0162c,Rv0761c,Rv1862,Rv3086  
Rv2790c

各行の遺伝子数を印刷する方法は?

答え1

1つの列とその中の列数だけを追加しようとしています。これは以下を使用して行うことができますawk

$ awk -F ',' '{ printf("%d,%s\n", NF, $0) }' data.in
3,Rv0729,Rv0993,Rv1408
4,Rv0162c,Rv0761c,Rv1862,Rv3086
1,Rv2790c

NFawk現在のレコード(行)のフィールド(列)数を含む変数です。各行にこの番号を印刷し、その後にコンマと行の残りの部分を印刷します。

他のオプション(結果は同じですが、よりきれいに見える場合があります):

$ awk -F ',' 'BEGIN { OFS=FS } { print NF, $0 }' data.in

FSは各レコードをフィールドに分割するために使用されるフィールド区切り文字であるため、コマンドラインでカンマにawk設定します(最初のソリューションに表示されます)。 ~である-F ','OFS出力FSフィールド区切り文字は、入力の最初の行を読み取り前と同じに設定します。

答え2

Rv[0-9]{4}c?質問のトピックで提案されているように、カンマで区切られたフィールド数の代わりにパターンが発生した回数を数えるには、次のようにします。

 awk '{print gsub(/Rv[0-9]{4}c?/, "&"), $0}'

答え3

パール方法:

$ perl -F, -pae 's/^/$#F+1 . ","/e' file
3,Rv0729,Rv0993,Rv1408  
4,Rv0162c,Rv0761c,Rv1862,Rv3086  
1,Rv2790c

Brandは、各入力行で与えられた文字列を分割し、結果フィールドを配列に格納するように-a動作します。したがって、は最も高い配列インデックスであり、配列は最初から計算されるため、配列の総要素数です。 「与えられたスクリプトを適用した後、各入力行を印刷します。これは代替演算子です。ここで、行の先頭をフィールド数+ 1とカンマ()で置き換えます。perlawk-F@F$#F@F0$#F+1-p-es///^$#F+1 . ","

答え4

あなたの質問によると、列3に遺伝子名が含まれています。実際の入力は次のように仮定します。

column1 column2 Rv0729,Rv0993,Rv1408  
column1 column2 Rv0162c,Rv0761c,Rv1862,Rv3086  
column1 column2 Rv2790c

列 3 の各遺伝子名には前の部分Rv文字列が含まれています。したがって、Pythonでは次のように計算できます。

$ python -c  "import sys;print map(lambda x: x.split()[2].count('Rv'),sys.stdin.readlines())"  < input.txt               
[3, 4, 1]

結果リストには、各行の遺伝子数が対応する順序で表示されます。より詳細に説明し、遺伝子に「Rv」文字列が含まれていない可能性を含めるには(列3がカンマ区切りの値文字列であると仮定しないでください)、次のこともできます。

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fd:
    for index,line in enumerate(fd):
        columns = line.strip().split()
        num_genes=len(columns[2].split(","))
        print("Line "+str(index)+" contains "+str(num_genes))

テスト実行:

$ ./count_genes.py input.txt                                                                                             
Line 0 contains 3
Line 1 contains 4
Line 2 contains 1

関連情報