计算最长的连续模式

CN_*_*133 4 awk pattern-matching

我有一个序列文件:

$猫文件
CACCGTTGCCAAACAATG
TTAGAAGCCTGTCAGCCT
CATTGCTCTCAGACCCAC
GATGTACGTCACATTAGA
ACACGGAATCTGCTTTTT
CAGAATTCCCAAAGATGG

我想计算 C+T 的最长延伸。我只能计算总 C+T,但我想要最长的伸展。

$ cat 文件 | awk '{ 打印 $0, gsub(/[cCtT]/,"",$1)}'
CACCGTTGCCAAACAATG 9
TTAGAAGCCTGTCAGCCT 10
CATTGCTCTCAGACCCAC 12
GATGTACGTCACATTAGA 8
ACACGGAATCTGCTTTTT 11
CAGAATTCCCAAAGATGG 7

预期的结果将显示出最长的C ^ + T舒展。

CACCGTTGCCAAACAATG 9 2
TTAGAAGCCTGTCAGCCT 10 3
CATTGCTCTCAGACCCAC 12 5
GATGTACGTCACATTAGA 8 2
ACACGGAATCTGCTTTTT 11 6
CAGAATTCCCAAAGATGG 7 5

Kus*_*nda 5

$ 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
Run Code Online (Sandbox Code Playgroud)

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 -
Run Code Online (Sandbox Code Playgroud)

它更快,因为它只分割线一次。第一个代码还尝试在空格上分割输入行。

使用它进行计时,mawk在 500000 行上显示 0.79 秒。第一个解决方案对相同的数据使用 1.69 秒,这表明分割操作可能花费最多的时间。


ste*_*ver 5

FWIW 这是一种在 perl 中实现的方法,使用maxfromList::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
Run Code Online (Sandbox Code Playgroud)