Awk 基于某些条件从文本文件中提取数据

Awk 基于某些条件从文本文件中提取数据,awk,gawk,Awk,Gawk,我有一个文本文件如下 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

我有一个文本文件如下

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

最长的起始位置和结束位置是什么意思?例如,ID01有两个位置290到298和290到299。我需要从290到299的位置。希望你能理解!为什么ID02/O991有两个输出?为什么ID05/Q151有两个?长度甚至不一样,所以这不是处理领带的问题。数据是否按排序顺序显示?如果您在标记中使用awk,则可能无关紧要。ID02和ID05有两个输出,因为数字范围不同。ID02中的403到404没有包含在输出中,因为403到404已经在400到405的范围内。同样地,在ID05中24到24没有包括在内。它已经在14到25之间了。太棒了!!非常感谢你!!
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