범위 목록(~부터)을 압축하고 싶습니다.

범위 목록(~부터)을 압축하고 싶습니다.

다음 형식의 범위에 할당된 코드와 관련된 데이터가 있습니다.

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" 값(코드 변경 전)을 저장합니다. 저장된 값을 사용하여 이 그룹을 인쇄하세요.

관련 정보