シーケンスファイルがあります。
$猫ファイル 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でmax
fromを使用する方法です。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
すべての項目で実行されます。その後、分割結果のビットを繰り返すことで最長ビットを探します。次に、見つかった最大長で元の行を印刷します。C
T
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 -
ラインを一度だけ分割するので、より高速です。最初のコードはまた、入力行をスペースに分割しようとします。
これをタイミングに使用すると、mawk
500000行に0.79秒が表示されます。最初のソリューションは、同じデータに1.69秒を使用します。おそらく最も時間がかかる分割作業です。
答え3
(sed
1行に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
。