たとえば、Sequence_Testというテキストファイルに次のシーケンスがあります。 AAAAATGATGATGTGATTAAATTTTTGAGTGATATGATATTTTTAGATATGAGTAGGATAGTATAGATAG
すべての「A」文字の位置番号を見つけて出力に返したいです。これを行うにはどのコマンドを使用する必要がありますか?
答え1
$ fold -w 1 file | sed -n '/A/='
1
2
3
4
5
8
11
16
19
20
21
28
30
34
36
39
41
47
49
51
53
56
59
62
64
67
69
71
73
これはfold
、入力された各文字をfile
独自の行に変換して各行sed
の行番号を出力するために使用されますA
。
このsed
コマンドは、などの他のコマンドに置き換えることができますawk '/A/ { print NR }'
。
もちろん特殊な用途awk
も可能です。以下は、substr()
各文字を順番に抽出し、その文字の位置を出力するために使用されます(存在する場合)A
。
awk '{ for (i = 1; i <= length; ++i) if (substr($0,i,1) == "A") print i }' file
カンマ区切りリストのすべての数字が必要な場合は、上記の結果をに渡してくださいpaste -s -d, -
。
答え2
使用幸せ(以前のPerl_6)
~$ raku -ne '.from.put for m:g/A/;' file
1行のファイルしかない場合は、上記の簡単なコードを使用できます。この.from
呼び出しは、一致が始まる場所(インデックス0)を知らせます。あるいは、.to
試合の終わりに戻る方法を使用することもできます。いずれにしても、位置は1行に1つずつ返されます。
複数行のファイルがある場合は、一致する文字がどこにあるかを知りたいと思います。各ライン。次のコードはハッシュ配列を生成し、その役割は次のとおりです。
~$ raku -ne 'state %a; state $i; $i++; for m:g/A/ { %a.push: $i => $_.from }; END .say for %a.sort;' file
サンプル入力(OPのサンプルヌクレオチド配列、間に空白行がある2回):
AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG
AAAAATGATGATGTGATTAAATTTTTGAGAGTGATATGATATTTTTATAGATATGAGTAGGATAGTATAGATAG
出力例:
1 => [0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72]
3 => [0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72]
通常、.say
人間が読める出力を提供するためにRakuで使用されますが、長いシーケンス(99個以上の要素)が切り捨てられるため、.put
製造にお勧めします。.say
上記の注:各行(最初の行であると仮定)の結果のみを返すには、次のように対応するキーを呼び出して関連する値をEND .say for %a.sort
返す<1>
ように上記のコードを変更します。END .put for %a<1>;
出力例(使用法END .put for %a<1>;
):
0 1 2 3 4 7 10 15 18 19 20 27 29 33 35 38 40 46 48 50 52 55 58 61 63 66 68 70 72