如何使用bash从大文件中提取所有以特定字符开头的单词?

时间:2017-06-21 03:54:46

标签: linux bash sed

我的文件很大,看起来像这样:

ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_coding"; exon_id "ENSE00001594002"; exon_version "1"; tag "basic"; transcript_support_level "5";
ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_coding"; exon_id "ENSE00001594002"; exon_version "1"; tag "basic"; transcript_support_level "5";
ENST00000629289"; transcript_version "2"; exon_number "22"; gene_name "CDK11B"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "CDK11B-208"; transcript_source "ensembl"; transcript_biotype "protein_coding"; protein_id "ENSP00000485937"; protein_version "1"; tag "basic"; transcript_support_level "5";

我想提取所有唯一以特定字符“ENST”开头的字词 我尝试了以下命令:

 sed 's/.*\(ENST.*transcript_version\)/\1/p'

但它打印出所有线条。 有人会帮我这个吗?

3 个答案:

答案 0 :(得分:6)

使用grep-o选项仅打印匹配的部分:

grep -Po '^ENST.*transcript_version' file

答案 1 :(得分:1)

使用sed

sed -E 's/^(ENST[[:digit:]]*.*transcript_version).*$/\1/' test11
ENST00000629289"; transcript_version
ENST00000629289"; transcript_version
ENST00000629289"; transcript_version

注意-E选项启用扩展正则表达式,如果不支持,则使用-r选项。此外,我觉得最优雅的解决方案是[ this ]

答案 2 :(得分:0)

您似乎对sed解决方案感兴趣,或者您可能因某些不寻常的原因需要一个sed解决方案 (否则我推荐一个grep解决方案,例如像这里提供的其他答案。可能不容易检查转录本在那里,但不打印它,我相信你的描述意味着,虽然你的代码是不同的。至少没有greps -P选项;例如在我的grep中不可用。或者使用perl或awk。)

为了:

  • 仅从匹配的行打印,使用-n
  • 仅打印" ENST00000629289&#34 ;; transcript_version",最后使用另一个.*
  • 不打印&#34 ;; transcript_version" (不确定你是否真的想要那个),移动\)
  • 仅打印" ENST *"使用更严格的正则表达式[[:alnum:]]*\).*(上面带\)

代码:

sed -n 's/.*\(ENST[[:alnum:]]*\).*transcript_version.*/\1/p'

输出:

ENST00000629289
ENST00000629289
ENST00000629289

代码2(包括"成绩单",如果你想要的话):

sed -n 's/.*\(ENST[[:alnum:]]*.*transcript_version\).*/\1/p'

输出2:

ENST00000629289"; transcript_version
ENST00000629289"; transcript_version
ENST00000629289"; transcript_version

我的sed:
GNU sed版本4.2.1