如何使用sed命令从快速标题中提取[]括号内的内容?



我有一个MSA fasta文件,标题是这种格式-

GAN08245.1/5-191 cyclin-L1 [Mucor ambiguus]
LNNPLASLEQLETTVSRR-DGISEELEADLRNLGAELIQSAGILLKLPQVAMATAQVLFQRFFYMSLKEFGI
V-EIGGLFLASTHLITVYDLIIRKMKGIVPLDAFSKAYNLKNAIAAEMQILRQLGFIVHVQLPYNMINYLRI
LGLISKRAWNYLNDEPATIACAAICREQGIKLPTLPGWWDVSAT-L----------------------
GES74777.1/6-191 cyclin-like protein [Rhizophagus clarus]
LQNAILTYGQLETTPSKK-DNIPEELEDELRRLGCDFVQSAGIVLRLPQVAMATAQVLFQRIIKESLLKGH-
----------------------RRYRNNESLEYLGVFYEMKDLVIAEMQILKKLGFNVHVQLPYGMVNYLKV
LELIPQKAWGYLNDQPATIACAVIARIAQVKLPTSPPWWEAEDE-ISRHIMRLY-NLPLDELEYLKKG

我希望输出只包含M.ambiguus,R.clarus等,并保持序列。
如何使用sed命令来实现?或者是否有其他命令来执行此操作?

我尝试使用awk,它提取出没有任何序列的名称。

awk -F '[][]' '{print $2}' input.fa > output.fa

您可以使用grepsed的组合:

grep -Eo '[.*?]' input.fa | sed -E 's:[(w)w*s*(.+)]:1.2:g' >output.fa

这里grep -o只从输入文件中查找并输出方括号及其内容。

sed删除括号,并将第一个单词替换为第一个字母和一个点。

两个命令中的-E开关使能ERE而不是BRE。

编辑:如果你想用[R.clarus]替换[Rhizophagus clarus]并保留所有其他内容,那就更简单了:

sed -E 's:[(w)w*s*(.+?)]:[1.2]:g' input.fa >output.fa

这可能适合您(GNU sed):

sed -nE 's/.*[(.)S+ ([^]]*)].*/1.2/p' file

关闭隐式打印-n和扩展regexp-E

匹配方括号内的第一个字符和第二个单词,并根据需要打印结果。

如何:

grep '[' my file.txt | sed -E 's/.*[//' | sed -E 's/].*//'