如何在行首修改带有字符的模式

时间:2019-01-17 20:43:04

标签: linux awk sed grep

我有一个数据文件,看起来像:

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 _ ####修改第一部分。

1 个答案:

答案 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";