시퀀스를 고정 너비로 ​​분할

시퀀스를 고정 너비로 ​​분할

이와 같은 파일이 있는데, 이는 탭으로 구분된 두 개의 열로 구성된 파일입니다.

CTGCAGTTTCCCCAAATGTGGGAAACTTGACTGTATAATTTGTGGCAGTGGTA   a1
GATTTCCCCAAATGTGGGAAACTCACTCGGCAGGCGTTGATA  a2

다음과 같은 출력을 얻고 싶습니다.

>a1
CTGCAGTTTCCCCAAATGTG
GGAAACTTGACTGTATAATT
TGTGGCAGTGGTA
>a2
GATTTCCCCAAATGTGGGAA
ACTCACTCGGCAGGCGTTGA
TA

내부에서 접기 명령을 사용하려고 합니다.. 다른 명령을 사용할 수 있습니까 awk?

또한, 각 행에 원하는 너비가 15이므로 다음과 같이 시도했지만 작동하지 않았습니다.

awk -F "\t" '{a=$(fold -w 50 $1);print a,$2}' file.txt 

어떻게 해야 하나요?

답변1

이를 수행하는 방법에는 여러 가지가 있습니다.

  1. 진주

    perl -ane '$F[0]=~s/.{15}/$&\n/g; print ">$F[1]\n$F[0]\n"' file 
    
  2. awk '{i=0; printf ">%s\n",$2;
           while(i<=length($1)){
                printf "%s\n", substr($1,i,15);i+=15
            }}' file
    

fold정말로 awk에서 사용하고 싶다면 이렇게 할 수 있습니다

awk '{printf ">%s\n",$2; system("echo " $1 "| fold -w 15 ") }' file

$()귀하의 시도는 사물이 아니라 껍질이기 때문에 실패합니다 awk. 내부에서 시스템 명령을 실행 awk하려면 system().$1(시퀀스) 대신에 쉘의 실제 문자열( $1이렇게 하면 쉘은 이를 평가하려고 시도하고 설정되지 않았기 때문에 공백을 반환합니다 )이므로 따옴표에서 제외 $1해야 합니다 .$1

따라서 이 예에서는

               |-------------------------> closing quotes for the 1st part
               |                    |----> closing quotes for the 2nd part
               v                    v   
system( " echo "  $1  " | fold -w 15")
        - ----    --- - ------------
        |  |       |  |       |----------> the 2nd part
        |  |       |  |------------------> opening quotes for the 2nd part       
        |  |       |---------------------> The awk variable, `$1`, 
        |  |                               outside the quotes.         
        |  |-----------------------------> The 1st part       
        |--------------------------------> opening quotes for the 1st part

답변2

그리고 :python test.py < inputtest.py

import sys
for i in sys.stdin:
     s, ident = i.rstrip().split()
     print '>{0}'.format(ident)
     while s:
          print s[:15]
          s = s[15:]

답변3

awk '{ print ">"$2 ; while (length($1)) { print substr($1,1,15) ; $1=substr($1,16) } }'

관련 정보