1

我有一个包含多个条目的文件,我想在其中替换每个条目的标题。

文件内容如下所示:

>gi|215277009|ref|NR_024540.1| Homo sapiens WAS protein family homolog 7 pseudogene (WASH7P), non-coding RNA
RNARNARNARNARNA
>gi|389886562|ref|NR_046018.2| Homo sapiens DEAD/H (Asp-Glu-Ala-Asp/His) box helicase 11 like 1 (DDX11L1), non-coding RNA
MORERNARNARNARNA
RNARNARNARNARNA
...

我想做这样的事情:

>NR_024540
RNARNARNARNARNA
>NR_046018
MORERNARNARNARNA
RNARNARNARNARNA

现在我编写了一个正则表达式,当我在(在测试字符串上)运行它时可以正常工作perl,但是当我运行以下sed命令(在 ubuntu 中)时,什么也没有发生。这个命令有什么问题?

sed -ri 's/\>[\w\|]+\|ref\|(\w+)\.\d+\|.*/\>\1/g' rna_copy.fa
4

3 回答 3

2

awk 将是一个更好的工具:

awk -F\| '/^>/{print ">"$4;next}1' test.in

或者

awk -F\| '/^>/{$0=">"$4}1' test.in

-F\|将字段分隔符设置为|
/^>/在以 a 开头的行上执行该块>
">"$4仅打印您感兴趣的部分,
next跳到下一行,并
1打印整行。

在第二个中,$0=">"$4将行设置为;然后因为1.

于 2013-06-22T17:38:49.167 回答
2

sed不使用\wor \d。您必须改用字符类。

sed -r 's/>[[:alnum:]\|]+\|ref\|([a-zA-Z0-9_]+\.[[:digit:]]).*/> \1/g'
于 2013-06-22T17:42:19.450 回答
2

GNU 的代码:

sed  -r 's/.*\|(\w+)\.[0-9]+\|.*/>\1/' file

$sed -r 's/.*\|(\w+)\.[0-9]+\|.*/>\1/' 文件
>NR_024540
RNARNARNARNARNA
>NR_046018
更多RNARNARNA
RNARNARNARNARNA

GNU sed 适用于\w,但不适用于\d.

于 2013-06-22T18:50:22.020 回答