组合重叠范围,同时在perl或shell中保持不重叠的范围

时间:2016-07-12 21:18:55

标签: perl shell command-line

任何达到它的人都有点棘手

我想找出一种在perl或bash / sh脚本中执行此操作的方法

我在下面有预期的输入和输出,并解释了它的含义,但无法真正理解我将如何实现这一目标

在这些文件中想到

column 1 - an indicator, those indicated with 'a' have no relation to those indicated with 'b' or 'c'
column 2 - the beginning of a range
column 3 - the end of a range
column 4 - a count, how many times something occurs

现在我有像

这样的文件
a   870 1470    58
a   870 5440    11
a   1470    3080    37
a   3080    3210    48
a   3080    5440    23
a   3210    4360    44
a   4360    5440    247
b   0   1090    10
b   0   4090    11
b   1090    3550    37
c   0       1250    10
c   1000    1500    5
c   1300    1700    5
c   1700    1900    12

我想创建类似

的文件
a   870  1470   69
a   1470 3080   48
a   3080 3210   82
a   3210 4360   78
a   4360 5440   281
b   0  1090   21
b   1090  3550  48
b   3550  4090  11
c   0    1000   10
c   1000 1250   15
c   1250 1300   5
c   1300 1500   10
c   1500 1700   5
c   1700 1900   12

...

输出说明:

The a's

行a1(870-1470)中的范围完全封装在第2行(870-5440)的范围内,因此870-1470范围内的出现次数为69

a   870  1470   69

行a3(1470-3080)中的范围也完全封装在第2行中,因此第3行的范围出现是48

a   1470 3080   48

第a4行(3080-3210)中的范围完全封装在第5行(3080-5440)和第2行(870-5440)的范围内,因此该范围的出现次数为82

a   3080 3210   82

The b's

行b1(0-1090)中的范围封装在行b2(0-4090)的范围内,因此0-1090范围内的出现量实际为21

b   0  1090   21

行b3(1090-3550)中的范围封装在行b2的范围内,因此1090-3550范围内的出现量实际为48

b   1090  3550  48

现在输入文件中未列出范围3550-4090,但此范围是行b2中尚未计算的范围的剩余部分,因此发生的次数为11

b   3550  4090  11

The c's

行c1(0-1250)中的范围与行c2(1000-1250)中的范围重叠,行c3(1300-1500)中的范围与行c2中的范围重叠。 将0-1000的范围包含在一起,其中没有其他范围重叠,因此该范围发生的次数为10

c   0    1000   10

行c1(1000-1250)范围的其余部分封装在行c2(1000-1500)的范围内,因此(1000-1250)范围发生15次

c   1000 1250   15

行c2中有一个范围与任何东西都不重叠(1250-1300),因此发生的次数为5

c   1250 1300   5

行c2(1300-1500)中的剩余范围封装在行c3(1300-1700)内,因此1300-1500范围发生的次数为10

c   1300 1500   10

第c3行(1500-1700)范围的其余部分与任何内容都不重叠并且发生5次

c   1500 1700   5

c4中的范围在任何地方都没有重叠,发生12次

c   1700 1900   12

感谢 - 你!

0 个答案:

没有答案