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