我有一个序列文件:
$猫文件 CACCGTTGCCAAACAATG TTAGAAGCCTGTCAGCCT CATTGCTCTCAGACCCAC 嘎嘎嘎嘎嘎嘎嘎嘎 ACACGGAATCTGCTTTTT 卡加特CCCAAAAGATGG
我想计算 C+T 的最长延伸。我只能计算总 C+T,但我想要最长的伸展。
$猫文件| awk '{ print $0, gsub(/[cCtT]/,"",$1)}' CACCGTTGCCAAACAATG 9 TTAGAAGCCTGTCAGCCT 10 猫GCTCTCAGACCCAC 12 嘎嘎嘎嘎嘎嘎嘎8 ACACGGAATCTGCTTTTT 11 CAGAATTCCCAAAGATGG 7
这预期结果将显示最长的 C+T 拉伸。
CACCGTTGCCAAACAATG 9 2 TTAGAAGCCTGTCAGCCT 10 3 猫猫GCTCTCAGACCCAC 12 5 嘎嘎嘎嘎嘎嘎嘎嘎 8 2 ACACGGAATCTGCTTTTT 11 6 CAGAATTCCCAAAGATGG 7 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
with sed
(假设每行不超过 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
。