我想压缩一个范围列表(从到)

我想压缩一个范围列表(从到)

我有涉及分配给范围的代码的数据,其形式为

From   To     Code
0      5      A
5      10     A
10     15     A
15     20     B
20     25     B
25     30     A
30     35     A
35     40     A
40     45     C
45     50     C
50     55     C
55     60     B
60     65     B
65     70     B

我想把这个列表压缩成这样的列表

From   To     Code
0      15     A
15     25     B
25     40     A
40     55     C
55     70     B

其中具有相同代码的连续范围(例如,0-5、5-10 和 10-15)被合并。我想知道这是否可以由sed或来完成awk

答案1

这可以很容易地完成awk

awk '
    NR==1{
        print
        next }
    f!=$3{
        if(NR!=2)
            print(line)
        printf("%s\t",$1)
        f=$3 }
    {
        line=$2 "\t" $3 }
    END{
        print line }
' 

答案2

使用全文替换:

perl -p0E 'while( s/\n(\d+\s+)(\d+)\s+(\w+)\n\2\s+(\d+\s+\3)/\n$1$4/ ){}'

或者带有注释和缩进...

perl -p0E 'while(                        # while we can
  s/\n                                      # substitute
    (\d+  \s+)   (\d+)  \s+     (\w+)  \n     # n1 n2 id
     \2   \s+    (\d+   \s+      \3 )         # n2 n3 id    by
   /\n$1$4/x                                  # n1 n3 id
){}'

答案3

如果数据始终按顺序排列(如您所呈现的),那么您可以简单地解析行,找到代码相同的“组”中的第一行和最后一行。对于每个组,保存第一行的“from”值和最后一行的“to”值(在代码更改之前)。使用您保存的值打印这些组。

相关内容