テキスト/シーケンスファイルで文字の場所を見つける必要がありますか?

テキスト/シーケンスファイルで文字の場所を見つける必要がありますか?

たとえば、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

https://raku.org

関連情報