首页 > 解决方案 > 提取文本文件中以 > 开头的行的方括号之间的信息

问题描述

我有很多看起来像这样的文本文件:

>CAA97360; SPAC26F1.03 [SCHPO]
M-----FRTCTKIGTVPKVLVNQKGLIDGLRRVTTDATTSRANPAHVPEEHDKPFPVKLD
DSVFEGYKIDVPSTEIEVTKGELLGLYEKMVTIRRLELACDALYKAKKIRGFCHLSIGQE

我想提取方括号之间的信息并保留下面的 M----FRT 等序列。所以我希望文本看起来像这样:

>SCHPO
M-----FRTCTKIGTVPKVLVNQKGLIDGLRRVTTDATTSRANPAHVPEEHDKPFPVKLD
DSVFEGYKIDVPSTEIEVTKGELLGLYEKMVTIRRLELACDALYKAKKIRGFCHLSIGQE

请问我怎么能用终端做到这一点?

标签: bashcommand-lineterminal

解决方案


使用 AWK,尝试以下操作:

gawk '{print gensub(/^>.*\[(.+)\]/, ">\\1", 1)}' text

输出:

>SCHPO
M-----FRTCTKIGTVPKVLVNQKGLIDGLRRVTTDATTSRANPAHVPEEHDKPFPVKLD
DSVFEGYKIDVPSTEIEVTKGELLGLYEKMVTIRRLELACDALYKAKKIRGFCHLSIGQE

说明:

  • awk函数gensub()在字符串(默认为$0当前行)中搜索正则表达式(第一个参数)并用第二个参数替换匹配的字符串。(请注意,这是一个非常粗略的gensub()功能概述。有关详细说明,请参阅手册页。)
  • 正则表达式/^>.*\[(.+)\]/匹配以 '>' 开头的行,后跟一些字符,以及用方括号括起来的子字符串。注意方括号内模式周围的括号。
  • 至于第二个参数,\\1(最左边的反斜杠只是转义下一个)表示上面正则表达式中的第一个括号表达式。它被称为 a back reference,您可以使用这种机制重用匹配的子字符串(在这种情况下是方括号之间的信息)。
  • 如果模式匹配,gensub()则返回修改后的字符串。否则返回原始字符串。所以只说print gensub() ...对匹配和不匹配的行都有效。

希望这可以帮助。


推荐阅读