시퀀스 파일이 있습니다.
$고양이 파일 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
한 줄에 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
.