用相邻字符串替换字符串

用相邻字符串替换字符串

我的 Linux 机器上有一个文件,其中有多行,结构如下:

s    名称.脚手架起始尺寸 方向 长度 顺序

我需要将其更改为

s 脚手架.脚手架起始尺寸 方向 长度 顺序

例如,更改为:

s       Sapo.scaffold_1  19037   10      +       13588361        ATAATAAAAT
s       Rana.RANA1        9000   10      +       13588361        ATAATAAAAT
s       Sapo.scaffold_5  19037   10      +       13588361        ATAATAAAAT
s       Sapo.scaffold_8  19037   10      +       13588361        ATAATAAAAT
s       Coqu.SGBE0296.1  68900   10      +       13588361        ATAATAAAAT

到:

s       scaffold_1.scaffold_1  19037   10      +       13588361        ATAATAAAAT
s       RANA1.RANA1             9000   10      +       13588361        ATAATAAAAT
s       scaffold_5.scaffold_5  19037   10      +       13588361        ATAATAAAAT
s       scaffold_8.scaffold_8  19037   10      +       13588361        ATAATAAAAT
s       SGBE0296.1.SGBE0296.1  68900   10      +       13588361        ATAATAAAAT

谢谢!

答案1

sed 's/[[:alnum:]]*\.\([[:alnum:]_.]*\)/\1.\1/' file

这将查找以一组字母数字字符开头,后跟一个点的字符串。这部分行将被删除。在这些之后,应该有一个由字母数字字符、点或下划线组成的字符串。这全部被表达式的第二部分替换两次,中间有一个点。

鉴于您在问题中的数据,这会产生

s       scaffold_1.scaffold_1   19037   10      +       13588361        ATAATAAAAT
s       RANA1.RANA1     9000    10      +       13588361        ATAATAAAAT
s       scaffold_5.scaffold_5   19037   10      +       13588361        ATAATAAAAT
s       scaffold_8.scaffold_8   19037   10      +       13588361        ATAATAAAAT
s       SGBE0296.1.SGBE0296.1   68900   10      +       13588361        ATAATAAAAT

这假设“名称”与 匹配[[:alnum:]]*,并且“支架”与 匹配[[:alnum:]_.]*

稍微“迂腐”的正则表达式是

sed 's/[[:alnum:]]\{1,\}\.\([[:alnum:]]\{1,\}\([._][[:digit:]]\{1,\}\)\{0,1\}\)/\1.\1/' file

其中点两侧的子字符串都不允许为空,并且脚手架后缀(_1.1等)可选地与脚手架名称分开匹配。

作为扩展的正则表达式(可能更容易阅读),这将被写为

sed -E 's/[[:alnum:]]+\.([[:alnum:]]+([._][[:digit:]]+)?)/\1.\1/' file

对于给定的数据,这会产生与第一个命令相同的输出。

答案2

awk '{
    sub(/[^.]*\./,"",$2) #From the 2nd field, remove all up to first dot
    $2=$2"."$2           #Replicate the resulting second field
    print
}' file | column -t

输出:

s  scaffold_1.scaffold_1  19037  10  +  13588361  ATAATAAAAT
s  RANA1.RANA1            9000   10  +  13588361  ATAATAAAAT
s  scaffold_5.scaffold_5  19037  10  +  13588361  ATAATAAAAT
s  scaffold_8.scaffold_8  19037  10  +  13588361  ATAATAAAAT
s  SGBE0296.1.SGBE0296.1  68900  10  +  13588361  ATAATAAAAT

答案3

尝试这个,

awk -F '\t' '{$2=gensub(/\w+\.(.*)/,"\\1.\\1","g",$2);}1' file | column -t

s  scaffold_1.scaffold_1  19037  10  +  13588361  ATAATAAAAT
s  RANA1.RANA1            9000   10  +  13588361  ATAATAAAAT
s  scaffold_5.scaffold_5  19037  10  +  13588361  ATAATAAAAT
s  scaffold_8.scaffold_8  19037  10  +  13588361  ATAATAAAAT
s  SGBE0296.1.SGBE0296.1  68900  10  +  13588361  ATAATAAAAT

相关内容