gpt4 book ai didi

linux - 根据值为每个条目提取记录子集

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:00 28 4
gpt4 key购买 nike

我是 unix 新手。我有如下 tab delim txt 文件:

ID     Region Strt End Length
sd_2_1 head 241 930 689
sd_2_1 trunk 16 240 224
sd_2_1 tail 1 15 14

sd_2_1 head 1 1 0
sd_2_1 trunk 2 832 830
sd_2_1 tail 833 930 97

sd_2_1 head 780 930 150
sd_2_1 trunk 663 779 116
sd_2_1 tail 1 662 661

sd_3_1 head 1020 1649 629
sd_3_1 trunk 783 1019 236
sd_3_1 tail 1 782 781

sd_3_1 trunk 1 1470 1469
sd_3_1 tail 1471 1649 178

sd_4_1 head 2 50 48
sd_4_1 trunk 51 701 650

sd_4_1 head 1 40 38
sd_4_1 trunk 41 101 60
sd_4_1 tail 102 122 20

具有不同条目(由空格分隔)的每个 Id 多个区域子集我想将每个 ID 与其自己的子集进行比较,并仅保留每个 ID 具有最大主干长度的子集。最后我想获取如下文件:

      ID     Region Strt End Length
sd_2_1 head 1 1 0
sd_2_1 trunk 2 832 830
sd_2_1 tail 833 930 97

sd_3_1 trunk 1 1470 1469
sd_3_1 tail 1471 1649 178

sd_4_1 head 2 50 48
sd_4_1 trunk 51 701 650

任何帮助将不胜感激。请指导我

最佳答案

awk 助您一臂之力!

$ (head -1 file && sed 1d file
| awk -v RS= '{len=0;
for(i=2;i<=NF;i+=5)
if($i=="trunk") {len=$(i+3); break}
if(len>v[$1]) {v[$1]=len; r[$1]=$0}
}
END{for(k in r) print r[k]}')
| column -t

ID Region Strt End Length
sd_2_1 head 1 1 0
sd_2_1 trunk 2 832 830
sd_2_1 tail 833 930 97
sd_3_1 trunk 1 1470 1469
sd_3_1 tail 1471 1649 178
sd_4_1 head 2 50 48
sd_4_1 trunk 51 701 650

Subshel​​l是将header和body分离出来进行处理。将记录分隔符设置为段落模式,为每条记录找到相应的长度(因为可能会缺少一些行所以复杂度不高)。为每个键选择最大值并在完成后打印。

如果您需要不同 ID 行之间的间距。

... | column -t | awk 'NR<3{p=$1} $1!=p{print "";p=$1} 1'

ID Region Strt End Length
sd_2_1 head 1 1 0
sd_2_1 trunk 2 832 830
sd_2_1 tail 833 930 97

sd_3_1 trunk 1 1470 1469
sd_3_1 tail 1471 1649 178

sd_4_1 head 2 50 48
sd_4_1 trunk 51 701 650

关于linux - 根据值为每个条目提取记录子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270804/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com