我的 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