가장 긴 연속 패턴 계산

가장 긴 연속 패턴 계산

시퀀스 파일이 있습니다.

$고양이 파일
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

( 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.

관련 정보