선의 한 부분을 다른 부분에 복사

선의 한 부분을 다른 부분에 복사

첫 번째 부분을 복사하고 싶습니다(익소스카EVm****t1_,아니요'.p[번호]') ">"로 시작하는 줄을 입력하고 같은 줄의 마지막 ":" 앞에 a를 붙여넣습니다.

입력하다:

>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal :13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal :1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal :315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

예상 출력:

>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal IxoscaEVm2293881t1:13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal IxoscaEVm2798449t1:1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal IxoscaEVm3186316t1:315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

답변1

awk를 사용하십시오.

$ awk 'split($1,a,/[>.]/) > 1{ $NF=a[2] $NF } 1' file
>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal IxoscaEVm2293881t1:13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal IxoscaEVm2798449t1:1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal IxoscaEVm3186316t1:315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

답변2

그리고 sed:

$ sed 's/^>\(\([^.]*\).*\):/>\1\2:/' file
>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal IxoscaEVm2293881t1:13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal IxoscaEVm2798449t1:1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal IxoscaEVm3186316t1:315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

교체는 sed표준 Fasta 헤더 태그로 시작하는 줄의 시작 부분을 줄의 마지막 부분까지 >대체 합니다. :이 작업을 수행할 때 첫 번째 점(식별자)까지의 부분(포함하지 않음) >과 줄의 전체 시작 부분을 캡처하지만 마지막 :문자는 캡처하지 않습니다. 대체의 대체 부분은 식별자를 삽입해야 하는 줄이고 그 뒤에 식별자와 가 옵니다 :.

인라인 Perl 대체와 유사한 것:

$ perl -pe 's/^>((.*?)\..*):/>$1$2:/' file
>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal IxoscaEVm2293881t1:13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal IxoscaEVm2798449t1:1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal IxoscaEVm3186316t1:315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

Perl을 다시 사용하여 명명된 캡처 그룹을 사용하십시오.

$ perl -pe 's/^>(?<partial_line>(?<id>.*?)\..*):/>$+{partial_line}$+{id}:/' file
>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal IxoscaEVm2293881t1:13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal IxoscaEVm2798449t1:1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal IxoscaEVm3186316t1:315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

답변3

한 가지 방법은 다음과 같습니다.

$ perl -pe 'if(/^\s*>(\S+?)\.p1/){$name=$1; s/(.*):/$1$name:/}' file.pep 
>IxoscaEVm2293881t1.p1 type:complete len:255 gc:Universal IxoscaEVm2293881t1:13-219(+)
MFLRQLGAPRFYYARLFLRFIAVTIGPFLKSFPEKMLFLTYFPFYFWQRFSNINKRRKLLPATFLTLG
>IxoscaEVm2798449t1.p1 type:partial5 len:345 gc:Universal IxoscaEVm2798449t1:1-183(+)
CEEREKLQFPTLVELFSTMKLLSCFPGLTLNIMGANIKRVRVSKLLNKYFAVEGRTWRVC
>IxoscaEVm3186316t1.p1 type:partial5 len:317 gc:Universal IxoscaEVm3186316t1:315-151(+)
NRIARLIGKNAEAGSVNYFFVSGSLLFGKPEQCALNLFLFLHSYYTLPFFIWCI

가설

  • 첫 번째 문자 앞에는 공백 문자가 없습니다 .p1.
  • . 로 시작하는 모든 줄도 >마찬가지입니다 .p1.

스크립트는 상대적으로 간단합니다. 줄이 0개 이상의 공백 문자로 시작하면 >( if(/^\s*>(\S+?)\.p1/))가 추가됩니다. 따라서 헤더 줄인 경우 .p1변수의 첫 번째 문자열 앞에 문자열을 저장합니다 $name( , 이는 괄호를 사용하여 $name=$1캡처했기 때문에 유효합니다. (\S+?)이전 단계). 그런 다음 줄의 마지막 항목 앞의 모든 항목을 :일치 항목, 이름, :( ) 순 으로 바꿉니다 s/(.*):/$1$name:/.

답변4

사용 gawk:

$ awk '{print gensub(/(\s*>)(IxoscaEVm.*t1)(.*)(:.*)/,"\\1\\2\\3\\2\\4", "g")}' file

또는

$ awk '/^>IxoscaEVm.*t1/{$NF = $1 $NF; gsub(/^>|\.p[0-9]{1,}/, "", $NF)}1' ffile

관련 정보