我有一个数据文件,看起来像:
Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]
我想修改transcript_id中的文本,并在该行中添加前10个左右的字符(给定的文件可以包含1000个以上的节点,因此我需要它来捕获整个节点号-但如果捕获了该节点就可以了一些“长度”一词)。因此,对于上面的第一组数据,我希望读取:
Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]
我尝试过:
sed 's/transcript_id "/transcript_id "SOMETHING/'
但是无法弄清楚要在sed的第二部分中添加什么,以便在同一行中用Node _ ####修改第一部分。
答案 0 :(得分:0)
假设该行中的第一个单词始终以_length
结尾,则此sed
命令应该这样做:
sed 's/^\(.*_\)length .* transcript_id "/&\1/' test.txt
输出:
Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_g361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_g362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_g362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]
如果不确定后缀'_length',请尝试以下操作:
sed 's/^\(.\{10\}\).*transcript_id "/&\1/'
输出:
Node_4_length augustus gene 234 1252 g361
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_leng361.t1";
Node_4_length augustus gene 3343 7552 . transcript_id "Node_4_leng361.t1";
protein sequence = [MRSVSLFLLGLAPLL]
Node_5_length augustus gene 334 1252 g362
Node_5_length augustus gene 4543 8252 . transcript_id "Node_5_leng362.t1";
Node_5_length augustus gene 19343 27552 . transcript_id "Node_5_leng362.t1";
protein sequence = [SNLVDWSEPTLTTIEEDTAGMAWA]
在两种情况下,您都会看到以下替换模式:
&\1
&
捕获整个匹配项,即从行首(^
)到开头引号("
)的所有内容。
在示例输入的第二行中,将是:
Node_4_length augustus gene 1543 2252 . transcript_id "
\1
捕获第一个捕获子模式,即\(
和\)
之间的所有内容。在我的第一个sed命令中,应该是:
Node_4_
这将形成完整的替换字符串:
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_
最初引号后面的所有内容均不受影响,因为它与模式不匹配。 这样就可以得到完整的输出:
Node_4_length augustus gene 1543 2252 . transcript_id "Node_4_g361.t1";