最長連続パターンの計算

最長連続パターンの計算

シーケンスファイルがあります。

$猫ファイル
CACCGTTGCCAAACAATG
TTAGAAGCCTGTCAGCCT
CATTGCTCTCAGACCCAC
おっぱいおっぱい
ACACGGAATCTGCTTTTT
カガアッドCCCAAAAGATGG

C + Tの最も長い拡張を計算したいと思います。合計C + Tのみを計算できますが、最長のストレッチが必要です。

$catファイル| awk '{ $0 印刷、gsub(/[cCtT]/,"",$1)}'
CACCGTTGCCAAACAATG9
TTAGAAGCCTGTCAGCCCT 10
猫GCTCTCAGACCCAC 12
コクコクコク8
ACACGGAATCTGCTTTTT 11
CAGAATTCCCAAAGATGG7

これ予想される結果最長のC + Tストレッチが表示されます。

CACCGTTGCCAAACAATG 9 2
TTAGAAGCCTGTCAGCT 10 3
猫猫GCTCTCAGACCCAC 12 5
コッコッコッコッコッコッコ 8 2
ACACGGAATCTGCTTTTT 11 6
CAGAATTCCCAAAGATGG7 5

答え1

FWIWこれはPerlでmaxfromを使用する方法です。List::Util

$ perl -MList::Util=max -lpe '$_ .= " " . max 0, map length, /[CT]+/gi' file
CACCGTTGCCAAACAATG 2
TTAGAAGCCTGTCAGCCT 3
CATTGCTCTCAGACCCAC 5
GATGTACGTCACATTAGA 2
ACACGGAATCTGCTTTTT 6
CAGAATTCCCAAAGATGG 5

答え2

$ awk '{ split($0, a, "[^CTct]+"); m=0
         for (i in a) {
             len=length(a[i])
             if (len > m) m=len
         }
         print $0, m  }' file
CACCGTTGCCAAACAATG 2
TTAGAAGCCTGTCAGCCT 3
CATTGCTCTCAGACCCAC 5
GATGTACGTCACATTAGA 2
ACACGGAATCTGCTTTTT 6
CAGAATTCCCAAAGATGG 5

プログラムは、大文字、小文字、または以外のawkすべての項目で実行されます。その後、分割結果のビットを繰り返すことで最長ビットを探します。次に、見つかった最大長で元の行を印刷します。CT

Romanはさまざまなソリューションのタイミングを見てきたので、より速い解決策は次のとおりです。

awk -F "[^CTct]+" '
    m = 0
    for (i = 1; i <= NF; ++i) {
        len = length($i)
        if (len > m) m = len
    }
    print m' file | paste file -

ラインを一度だけ分割するので、より高速です。最初のコードはまた、入力行をスペースに分割しようとします。

これをタイミングに使用すると、mawk500000行に0.79秒が表示されます。最初のソリューションは、同じデータに1.69秒を使用します。おそらく最も時間がかかる分割作業です。

答え3

sed1行に19文字以下と仮定)楽しみでREマッチングの貪欲な属性を使用するには、次のようにします。

sed '
  h;y/cCtT/xxxx/;x;H;s/./x/g;G
  s/^\(x*\).*\n.*\1.*\n/\1 /
  s/^x\{10\}/1/;s/$/:9876543210xxxxxxxxx/
  s/^\(1*\)\(x*\) \(.*\):.*\(.\).\{9\}\2$/\3 \1\4/'

@Kusalanandaのソリューションバリアント:

awk -F '[^cCtT]+' '
  {
    max = 0
    for (i = 1; i <= NF; i++)
      if ((l = length($i)) > max)
        max = l
    print $0, max
  }'

答え4

また試み

awk '
        {T0 = $0
         while (match (T0, /[CTct]+/))  {if (RLENGTH > MX) MX = RLENGTH
                                         T0 = substr (T0, RSTART+RLENGTH)
                                        }
         print $0, MX
        }
' file

他の提案と比較して時期が少し速いですawk

関連情報