2016-08-30 1 views
1

머리글이 각각 -XXXX- 및 꼬리말 $$$$ 인 데이터가 반복되는 큰 텍스트 파일이 있습니다. 약 20k 개의 항목이 있으며 각 항목을 500 개의 항목으로 분리하고 싶습니다.구분 기호 n 번째 인스턴스에서 텍스트 파일을 여러 파일로 분할

저는 awk으로 놀고 있었고, 아래 명령을 사용하여 닫았습니다. 각 파일은 -XXXX-으로 시작하지만 첫 번째 파일 이후의 모든 파일에는 끝에 부분 항목이 있습니다. 예를 들어

awk "/-XXXX-/ { delim++ } { file = sprintf(\"file%s.sdf\", int(delim/500)); print > file; }" < big.sdf 

: 내가 대신 각 파일에 바로 $$$$ 후 종료 할

-XXXX- 
Beginning 
Middle 
End 
$$$$ 
-XXXX- 
Beginning 

.

Windows에서 awk을 사용하고 있습니다.

+0

'처음에는 부분적으로 입력이 된 다음 모든 파일'이라고 말하면 입력 데이터 파일이나 현재 출력중인 내용을 설명하고 있습니까? ? –

+0

현재 출력 중입니다. 첫 번째 파일은 $$$$ 바로 아래에서 올바르게 절단됩니다. 후속 파일에는 -XXXX- 다음에 부분 항목이 포함됩니다. 참고 : Cygwin 셸에서 위의 코드를 실행하면 올바른 동작을 얻을 수 있지만 Windows의 명령 프롬프트에서 위와 같이 위의 명령을 실행하면 찾을 수 있습니다. – macaday

+0

무슨 일이 일어나고 있는지 나는 힘들어 할 것입니다. 필자는 몇 년 만에 처음으로 모든 Windows 컴퓨터에 액세스 할 수 없으므로 문제를 매우 쉽게 복제 할 수는 없습니다. 당신이 말하는 것은 특이하게 들립니다. 파일이 개행 문자로 종료 되었습니까 (Windows의 경우 CRLF)? 그렇지 않다면, 당신이보고있는 것을 설명 할 수 있습니다. –

답변

2

-XXXX-와 $$$$ 사이의 각 데이터 세트가 레코드 인 경우 파일을 분리하기 위해 한 번에 500 레코드 씩 작성하고 싶습니까? 두 개의 카운터가 필요한 것 같습니다. 하나는 출력 파일 이름에 대한 것이고, 다른 하나는 현재 "배치"에있는 레코드 수입니다.이 레코드는 최대 500 개가되지만 다음 배치의 경우 0으로 재설정됩니다. 뭔가 같은 :

BEGIN {fctr=1 ; rctr=0 ; file=("file" fctr ".sdf")} 
/^\$\$\$\$$/ {print > file ; rctr+=1} 
rctr==500 {fctr+=1 ; file=("file" fctr ".sdf") ; rctr=0} 
!/^\$\$\$\$$/ {print > file} 
  • 1 호선은 초기 값을 설정하고

  • 2 호선 각 레코드의 바닥 글 일치 file1.sdf와 함께 시작합니다, 우리는 기록 카운터에게 우리가 볼 때마다 증가 하나 (현재 바닥 글 작성은 물론)

  • 라인 3은 500 레코드에 도달 할 때 사용됩니다. 먼저 다음 파일 이름으로 이동 한 다음 레코드 수를 다시 0으로 재설정하십시오.

  • 라인 4는 모든 일반 라인 용입니다. 현재 파일 이름이 무엇이든간에 파일을 보내십시오.

관련 문제