Quero condensar uma lista de intervalos (de-para)

1

Eu tenho dados envolvendo códigos atribuídos a intervalos na forma de

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

Eu quero condensar essa lista em uma lista como esta

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

onde intervalos contíguos (por exemplo, 0-5, 5-10 e 10-15) com o mesmo código são mesclados. Eu estou querendo saber se isso poderia ser feito por sed ou awk .

    
por John Doucette 04.03.2015 / 21:47

3 respostas

2

Isso pode ser feito facilmente por 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 }
' 
    
por 04.03.2015 / 22:30
1

Usando substituições de texto completo:

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

ou com comentários e recuo ...

perl -p0E 'while(                        # while we can
  s/\n                                      # substitute
    (\d+  \s+)   (\d+)  \s+     (\w+)  \n     # n1 n2 id
        \s+    (\d+   \s+       )         # n2 n3 id    by
   /\n$1$4/x                                  # n1 n3 id
){}'
    
por 05.03.2015 / 10:24
0

Se os dados estão sempre em ordem (como você apresentou), então você pode simplesmente analisar linhas encontrando a primeira e a última linha em um "grupo" onde o código é o mesmo. Para cada grupo, salve o valor "de" para a primeira linha e o valor "para" da linha final (antes que o código seja alterado). Imprima os grupos usando os valores que você salvou.

    
por 04.03.2015 / 22:05