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
NF
awk
現在のレコード(行)のフィールド(列)数を含む変数です。各行にこの番号を印刷し、その後にコンマと行の残りの部分を印刷します。
他のオプション(結果は同じですが、よりきれいに見える場合があります):
$ 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とカンマ()で置き換えます。perl
awk
-F
@F
$#F
@F
0
$#F+1
-p
-e
s///
^
$#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