bash - 提取文本文件中以 > 开头的行的方括号之间的信息
问题描述
我有很多看起来像这样的文本文件:
>CAA97360; SPAC26F1.03 [SCHPO]
M-----FRTCTKIGTVPKVLVNQKGLIDGLRRVTTDATTSRANPAHVPEEHDKPFPVKLD
DSVFEGYKIDVPSTEIEVTKGELLGLYEKMVTIRRLELACDALYKAKKIRGFCHLSIGQE
我想提取方括号之间的信息并保留下面的 M----FRT 等序列。所以我希望文本看起来像这样:
>SCHPO
M-----FRTCTKIGTVPKVLVNQKGLIDGLRRVTTDATTSRANPAHVPEEHDKPFPVKLD
DSVFEGYKIDVPSTEIEVTKGELLGLYEKMVTIRRLELACDALYKAKKIRGFCHLSIGQE
请问我怎么能用终端做到这一点?
解决方案
使用 AWK,尝试以下操作:
gawk '{print gensub(/^>.*\[(.+)\]/, ">\\1", 1)}' text
输出:
>SCHPO
M-----FRTCTKIGTVPKVLVNQKGLIDGLRRVTTDATTSRANPAHVPEEHDKPFPVKLD
DSVFEGYKIDVPSTEIEVTKGELLGLYEKMVTIRRLELACDALYKAKKIRGFCHLSIGQE
说明:
- 该
awk
函数gensub()
在字符串(默认为$0
当前行)中搜索正则表达式(第一个参数)并用第二个参数替换匹配的字符串。(请注意,这是一个非常粗略的gensub()
功能概述。有关详细说明,请参阅手册页。) - 正则表达式
/^>.*\[(.+)\]/
匹配以 '>' 开头的行,后跟一些字符,以及用方括号括起来的子字符串。注意方括号内模式周围的括号。 - 至于第二个参数,
\\1
(最左边的反斜杠只是转义下一个)表示上面正则表达式中的第一个括号表达式。它被称为 aback reference
,您可以使用这种机制重用匹配的子字符串(在这种情况下是方括号之间的信息)。 - 如果模式匹配,
gensub()
则返回修改后的字符串。否则返回原始字符串。所以只说print gensub() ...
对匹配和不匹配的行都有效。
希望这可以帮助。
推荐阅读
- python - 有没有办法在输入输入后使用 Python 打开特定网页?
- javascript - 使用 vue js 框架时如何评估 js 文件中的新实例?
- google-apps-script - AppsScript - 在 Google 表格上复制“将图像放入选定单元格”
- c# - 在 UWP 中,如何在 ItemRepeater 中设置操作按钮?
- python-3.x - python 3中的提示'...'是什么意思?
- node.js - 我需要将我的节点 js 网站保护到在 HTTP 的默认 80 端口上运行的 HTTPS
- java - Java排序逻辑和识别两个对象的最大值
- html - 防止在单击图标 i 时单击父元素 li
- c++ - 当我调用 execvp 运行 java 时发生错误
- java - 控制流条件