仅使用sed

时间:2018-07-04 14:05:00

标签: sed

我有类似的东西

chr1 162724289 162724421 CAAAATGTTTATAAGGACAGCCTGCTCTCTCCCCTCAGTACAGGGCAGCTGCTTGCCTGTGAACCAGTAAACAGCTCTGTGGTTTCATGGTTGCTCCCTCTCTCCCCAACCCTCACCTCTCAAGGCTGGACT chr1 162724414 162724421 ID=exon:ENST00000367921.3:5;Parent=ENST00000367921.3;gene_id=ENSG00000162733.12;transcript_id=ENST00000367921.3;gene_type=protein_coding;gene_status=KNOWN;gene_name=DDR2;transcript_type=protein_coding;transcript_status=KNOWN;transcript_name=DDR2-002;exon_number=5;exon_id=ENSE00001165686.1;level=2;protein_id=ENSP00000356898.3;ccdsid=CCDS1241.1;havana_gene=OTTHUMG00000034423.4;havana_transcript=OTTHUMT00000097650.1;tag=basic,appris_principal,CCDS

我只想从第8列中提取exon_number=5。这是一个很长的单行命令,并且由于我还有其他要保留的列,我想我不能使用awk -F ';'。我尝试过类似的事情:

sed -E 's/ ID=*\(exon_number=[0-9]\)* \1/'

所需的输出:

chr1 162724289 162724421 CAAAATGTTTATAAGGACAGCCTGCTCTCTCCCCTCAGTACAGGGCAGCTGCTTGCCTGTGAACCAGTAAACAGCTCTGTGGTTTCATGGTTGCTCCCTCTCTCCCCAACCCTCACCTCTCAAGGCTGGACT chr1 162724414 162724421 exon_number=5

任何建议都会很棒! 谢谢

2 个答案:

答案 0 :(得分:2)

使用sed,您可以完全匹配并删除所需内容:

sed -E 's/(.* )ID=[^[:space:]]*(exon_number=[0-9]+).*/\1\2/'

请参见online sed demo

说明

  • -E-POSIX ERE语法启用选项
  • (.* )ID=[^[:space:]]*(exon_number=[0-9]+).*-匹配的rege模式:
    • (.* )-第1组:尽可能多的0个字符,然后是一个空格
    • ID=[^[:space:]]*-ID=和0+个空格字符
    • (exon_number=[0-9]+)-exon_number=和1个或多个数字(第2组)
    • .*-该行的其余部分
  • \1\2-替换模式将第1组和第2组的内容插入到结果字符串中。

答案 1 :(得分:1)

编辑: :根据OP更改了要求,因此仅按要求放置解决方案。

awk -F";" 'match($0,/exon_number=[0-9]+/){val=$1;sub(/ ID.*/,"",val);print val,substr($0,RSTART,RLENGTH)}'  Input_file

遵循简单的awk可能会对您有所帮助。

awk 'match($0,/exon_number=[0-9]+/){print substr($0,RSTART,RLENGTH)}' Input_file

解决方案2: :如果您的Input_file始终具有相同类型的数据,则只需按字段进行打印即可。

awk -F";" '{print $11}'  Input_file