範囲リスト(〜から)を圧縮したいです。

範囲リスト(〜から)を圧縮したいです。

次の形式の範囲に割り当てられたコードに関連するデータがあります。

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)を含む連続範囲はマージされます。sedorでこれを行うことができるかどうか疑問に思います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」値(コード変更前)を保存します。保存した値を使用してこのグループを印刷します。

関連情報