linux - 使用 sed/awk/grep 从 .gff 文件中提取子字符串

标签 linux shell sed grep

我有一个包含多行的文件,如下所示:

NODE_1_length   Prodigal:2.6    CDS     11      274     .       +       0       ID=PROKKA_00001;inference=ab initio prediction:Prodigal:2.6;locus_tag=PROKKA_00001;product=hypothetical protein

我想提取 ID=PROKKA_[无论数字] 以及“product=”之后的所有内容以获得如下输出:

ID=PROKKA_00001 product=hypothetical protein

我不太熟练使用 sed,所以我尝试调整我在这里和周围找到的一些解决方案,但没有成功。如果解决方案分两步进行(一步用于 ID,一步用于产品),那么我可以将两个结果合并到一个文件中。

如果您能对所使用的正则表达式进行解释,我将不胜感激。

到目前为止,我尝试将问题一分为二(从 ID 开始)并尝试:

grep -o 'ID=PROKKA_[0-9]{1,5}*'
sed 's/^ID=PROKKA[0-9]*;//g/
grep -Po 'ID="K[^"]*'

但当然,它们都不起作用。 感谢您的帮助!

最佳答案

您可以使用grep -oE:

grep -oE 'ID=PROKKA_[0-9]+|product=[^;:]+' file

ID=PROKKA_00001
product=hypothetical protein

如果您希望结果在同一行,请使用grep + Past:

grep -oE 'ID=PROKKA_[0-9]+|product=[^;:]+' file | paste -s

关于linux - 使用 sed/awk/grep 从 .gff 文件中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51363954/

相关文章:

python - 打印匹配行和匹配行之前的一行

regex - Sed 不使用正则表达式

linux - Bash 输入重定向为命令提供标准输入而不是参数/文件名?

shell - CYGWIN 终端 : FTP Connection (Password Input doesn't end)

linux - 我需要从文件中的列子集而不是整个文件中找到一个字符串

linux - 如何测试 File2 中是否存在 File1 每一行的子字符串

linux 在字符串匹配之前插入文件内容

linux - systemd 无法为 Tomcat 启动定制服务

c - ipoib : Check if an infiniband node with an given iboip is reachable

c# - linux下C++中Gmap.Net的替代品