명령의 출력이 있습니다( 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" 값과 실제로 같은지 확인하는 것이 아닙니다 ;
.