从文本文件中提取线条图案

时间:2013-06-22 17:33:29

标签: regex perl sed awk pattern-matching

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

文件内容如下所示:

>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

3 个答案:

答案 0 :(得分:2)

Awk将是一个更好的工具:

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

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

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

在第二个中,$0=">"$4将行设置为;然后由于1打印出来。

答案 1 :(得分:2)

sed不使用\w\d。你必须改用字符类。

sed -r 's/>[[:alnum:]\|]+\|ref\|([a-zA-Z0-9_]+\.[[:digit:]]).*/> \1/g'

答案 2 :(得分:2)

GNU代码

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

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

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