2014-01-18 228 views
-1

我有一个文本文件如下提取数据

ID  Name position_start position_end 
ID01 P889  290  298 
ID01 P889  290  299 
ID02 O991  400  405 
ID02 O991  355  373 
ID02 O991  403  404 
ID05 Q151  428  429 
ID05 Q151  428  428 
ID05 Q151  24  24 
ID05 Q151  14  25 

我想提取最长的起点和每个ID的结束位置。我所需的输出如下所示。

ID  Name position_start position_end 
    ID01 P889  290  299 
    ID02 O991  400  405 
    ID02 O991  355  373 
    ID05 Q151  428  429 
    ID05 Q151  14  25 
+0

你是什么时间最长的起始和结束位置是什么意思? –

+0

例如,ID01有两个职位290至298和290至299.我需要从290至299的职位。希望你能理解! – user3209035

+0

为什么ID02/O991有两个输出?为什么两个ID05/Q151?长度不一样,所以它不是一个处理关系的问题。数据是否按排序顺序显示?如果您在标签中使用'awk',则可能无所谓。 –

回答

2
sort -k1,1 -k2,2 -k3,3n -k4,4n file > temp 

awk 'NR==1{print;next} 
NR==2{start=$3;end=$4;id=$1 OFS $2;next} 
{ if ($1 OFS $2 == id &&$3<=end) 
     {end=end>$4?end:$4;next} 
    print id,start,end;start=$3;end=$4;id=$1 OFS $2 
}END{print id,start,end}' OFS="\t" temp 

ID  Name position_start position_end 
ID01 P889 290  299 
ID02 O991 355  373 
ID02 O991 400  405 
ID05 Q151 14  25 
ID05 Q151 428  429 
+0

非常棒!非常感谢你!! – user3209035