세미콜론으로 시작하는 줄로 구분된 텍스트 분할

세미콜론으로 시작하는 줄로 구분된 텍스트 분할

명령의 출력이 있습니다( plantuml -language; 참조BBEdit 코드리스 언어 모듈의 키워드, 사전 정의된 이름, 기호 목록이 있습니까?배경) 실제로는 다음과 같습니다.

;type1
;3
@fff
@ggg
hhh

;preprocessor
;1
!undef

;keyword
;3
!undef
test
somemore

.
.
.

첫 번째는 ;이름을 나타내고 두 번째는 ;다음 줄의 항목 수를 나타냅니다. 이러한 항목 뒤에는 다음 블록이 시작되는 빈 줄이 옵니다.

전체 출력을 추가로 처리할 별도의 파일(이름이 지정된)로 분할하고 싶습니다.

문서 type1:

@fff
@ggg
hhh

문서 preprocessor:

!undef

문서 keyword:

!undef
test
somemore

와 같은 도구를 사용하여 awk이 작업을 어떻게 수행할 수 있습니까 sed? 아니면 더 쉬운 도구가 있나요?

답변1

어쩌면 가장 우아한 해결책은 아닐 수도 있지만, 이것이 효과가 있는 것 같습니다:

awk -F';' '
  NF==0 { next }
  NF>1 && $1=="" { filename=$2; getline; next }
  { print > filename }
' file
  • 필드 수가 0(빈 행)이면 다음 행으로 계속 진행합니다.
  • 필드 수가 1(세미콜론으로 시작하는 줄)보다 큰 경우 변수를 설정하고 filename다음 줄을 가져오지만 처리하지 않고(건너뛰고) 다음 줄을 계속 진행합니다.
  • 그렇지 않으면 해당 행을 인쇄하고 출력을 file 로 리디렉션합니다 filename.

답변2

내가 할게

awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file

awk 언어에서 파일은 "레코드"로 구성되고 레코드에는 "필드"가 포함됩니다. 기본적으로 하나의 레코드 == 하나의 행이지만 구성할 수 있습니다.

이는 입력 레코드 구분 RS변수를 빈 문자열로 사용합니다. 즉, 일련의 빈 줄이 레코드를 구분한다는 의미입니다. 필드 구분 기호를 개행 문자로 설정했습니다. 요약하면 파일의 각 "단락"은 레코드이고 단락 내의 각 줄은 필드입니다.

호출 substr에서는 선행 세미콜론만 생략됩니다.

실제로 데이터 행의 수가 두 번째 행의 "n" 값과 실제로 같은지 확인하는 것이 아닙니다 ;.

관련 정보