다음 형식의 범위에 할당된 코드와 관련된 데이터가 있습니다.
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
or 으로 이 작업을 수행 할 수 있는지 궁금합니다 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" 값(코드 변경 전)을 저장합니다. 저장된 값을 사용하여 이 그룹을 인쇄하세요.