将一行的一部分复制到另一部分

将一行的一部分复制到另一部分

我想复制第一部分(IxoscaEVm****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
  • 所有以 a 开头的行>也有.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

相关内容