길이를 필터링

길이를 필터링

다음과 같은 3940개의 시퀀스가 ​​포함된 파일이 있습니다.

>TCONS_00000066 gene=XLOC_000030
CCGCCGGCTGCTGCGCGCACCGACTTGTCACCACCCCAGCACGTCCTCCACGTATACAAG
CGCTACGGTCCACCGCGGCAGCGTCGACGTCCTTGTCCGCAAACATGGTGGTGGCAGCTT
CCTCATCGAGCAGCAGCAACTCATCCTCGAGGGGAAGGGCCCAGAGCTTCTAATCCTACA
CGGCAACAACACTTTATACTTGTGTATAATTTCTCTTCGTTTCTGAGTTCATGGCTATCT
TTGTCTCTCTTATCTTCTCCCTTTTGCTATCTCTATATTTGTGATTGCCATGGAAATACA
>TCONS_00006042 gene=XLOC_003448
GCCACTAGCCAGCCCAGCCAGGGGAAGGGGAGGAGCTGCAAGCCCAACCCCCTGCTCAAC
CCTAAATTGCTTCCGCCGATCGGTGAGAGCTCCGATGCCTTCTTCTTCTTCTTCTTCCTC
CCCCTCTACCTGTTCCTTCTCCGAGATAACTGCAACATTTTCAGCACTTTTTCTGGCCAT
TCTCAAGTCCCCAGCCCAGGGACTAGAGTGTTACTATGGCTAGAGCAAATGAGATGGTCA
GGGCAGACTCAAGGATGATGGTTGTCTTTAGTGCCCTGGCATCTAAATCAGGGCCACTGA
CATTTGAAGACTCGCTCAGATTTGTCAAGAAAGTGAAGGCTTGTAACTACATGTTGTATT

200자를 초과하는 다른 파일의 시퀀스를 원합니다.

답변1

sed, awk 또는 grep을 사용할 수 있습니다.

awk 'length($0)>200' file > newfile

또는

grep '^.\{201\}' file > newfile

답변2

awk먼저 >레코드 구분 기호를 설정 해야 합니다.

awk 'BEGIN{RS=">";ORS=""}length($0)>200{print ">"$0}' input > output

또 다른 옵션 pcregrep:

pcregrep -M '^>[^>]{201,}' input > output

아니면 제목에 있는 문자가 아닌 DNA 서열만 계산하세요.

pcregrep -M '^>[^>]*\n[^>]{201,}' input > output

답변3

파이썬( split.py):

import sys

# call with the file as parameter

base = 0
line = ''
with open(sys.argv[-1]) as fp:
    with open('shorter', 'w') as fps:
        with open('longer', 'w') as fpl:
            for x in fp:
                if line and x.startswith('>'):
                    print len(line), base
                    if (len(line) - base) >= 200:
                        fpl.write(line)
                    else:
                        fps.write(line)
                    line = x
                    base = len(x)  # lenght of the ">..." line
                    continue
                if x.startswith('>'):  # very first one
                    base = len(x)
                line += x
            if line:
                if len(line) >= 200:
                    fpl.write(line)
                else:
                    fps.write(line)
                line = ""

python split.py inputfilethen 으로 호출 mv shorter inputfile(파일이 정상인지 확인 후)

답변4

cat file | while read -r line; do
  if [ ${#line} -gt 200 ]; then
    echo "${line}"
  fi
done

편집 질문이 업데이트되었습니다. 행 길이가 필요하지 않지만 행 집합의 길이가 필요합니다.

아래 스크립트에서는 >TCONS를 에코합니다. 그렇지 않으면 스크립트가 마지막 클릭을 건너뜁니다.

multiline=""
(cat input; echo ">TCONS string for last token") | while read line; do
        if [[ "$(echo "${line}"| cut -c1-6)" = ">TCONS" ]]; then
                if [ ${#multiline} -gt 200 ]; then
                        echo "${multiline}"
                fi
                multiline=""
        else
                multiline="${multiline}${line}"
        fi
done

관련 정보