我有类似的东西
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
任何建议都会很棒! 谢谢
答案 0 :(得分:2)
使用sed
,您可以完全匹配并删除所需内容:
sed -E 's/(.* )ID=[^[:space:]]*(exon_number=[0-9]+).*/\1\2/'
说明
-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