2012-06-18 5 views
-3

나는 a very similar StackOverflow question을 이해하기 위해 최선을 다했지만, 내 인생에서 제안 된 gawk 또는 split 해결책 중 하나를 내 케이스에서 작동시킬 수는 없습니다.텍스트 파일을 여러 텍스트 파일로 나누기

큰 텍스트 파일은 288 개의 제안서로 구성되며, 각 텍스트는 길이가 300에서 500 단어이고 다양한 단락 수입니다 (일관된 줄 수 없음). 그러나 각 제안은 --###-- 또는 --####--의 ID로 구분됩니다. 마킹 마커가 없습니다 - 내가 정규식 검색을 수행하여 하나를 삽입하고 여러 파일로 분할하기 전에 원래 파일을 대체 할 수 있다고 생각하지만. 내가 원한 것은 288 개의 개별 텍스트 파일 모음으로 두 개의 대시 사이의 숫자로 이름이 지정됩니다. 그것이 더 쉬운 일이라면, 나는 세 개의 숫자와 네 개의 숫자로 된 제안 사이에서 파일을 쉽게 분리 할 수 ​​있습니다. 간단히 말해서

, 나는이 작업을 수행 할 수 :

#! /bin/env bash or python 

Split all_proposals.txt into 121.txt, 122.txt, etc. 

Where all_proposals.txt consists of: 

    --121-- 

    One Line Title of Proposal 

    Followed by several paragraphs each on a line of variable length. 

    Another paragraph for effect. 

    --122-- 

    More lines indeterminate in number. 
+6

당신의 질문은 "당신이 나를 위해이 코드를 작성해 주시겠습니까?"는 스택 오버플로가 아닌 것 같습니다. 작동하지 않는 것을 시도 했습니까? –

+0

'/ bin/env'는 표준 위치가 아닙니다. '/ usr/bin/env'를 원한다. –

+0

@NedBatchelder : 이전의 시도는 다음과 같습니다 :'csplit abstracts.txt '/ - [0-9] [0-9] [0-9] - /' '{186}'',' csplit -f abs abstracts.txt '/ - [0-9] [0-9] [0-9] - /' '{186}' ','awk '/ - \ d/{f = 1 ; \ n '-vprefix = "file"';}} {c} {print} "세션" {print> 접두사 "ab-"NR ".tx t"} 'abstracts_no_id.txt' ... 그래, 네, 여러 가지 일을 시도했습니다. –

답변

0

당신은 펄을 사용하여 한 번 봐 가지고,이 경우 특히

r'(--[0-9]*--)' 

같은 식으로 할 수있다 당신의 식별자를 검색하는 것입니다 :

#!/usr/bin/perl 
open(FI,"file.txt"); 
read(FI,$_,10000000); 
close(FI); 
@arr = split('--###--'); 
$cnt=0; 
for $c (@arr) 
{ 
    open(FO,">$cnt.txt"); 
    print FO $c; 
    close(FO); 
    $cnt++; 
} 
+0

펄의'split'은 "#"문자를 정규식 대신 파일에있는 숫자로 대체한다고 생각합니까? – jdi

+0

나는'- ### -'을'- [0-9] [0-9] [0-9] - '로 바 꾸었습니다. 나는 작은 글자로 된 디렉토리를 가지고 있습니다. . 여기에 추가 할 두 가지 사항이 있습니다. 첫째, 헤더 이름이 거래 차단기가 아니며 두 번째로 Perl은 내 친족을 넘습니다. –

+0

@ user14664130 - 닫힌 질문에도 불구하고 답장에 가장 가까운 나를 받기위한 체크 표시가 여전히 유효하다고 생각합니다. (미안하지만별로 유용하지 않다.) –

1

그냥 설정 한 출력 파일의 이름 머리글과 선을 볼 때마다 :

awk '/--[0-9]*--/ {split($0, a, "--"); output=a[2]".txt" } 
    { print > output }' all_proposals.txt 

참고이 인쇄 파일의 헤더 행. 원하지 않는 경우 헤더의 작업 시퀀스에 next 명령을 추가하십시오.

+0

내가 본 awk 중에서 가장 놀랍다. 이전에'awk'에서 시도한 것과 마찬가지로, 출력은 원본 파일의 복제본이지만 첫 번째 헤더로 간단하게 재 명명되었습니다. 내가 놓친 핵심 정보가 누군가에게 명백하게 드러나는 것처럼 느껴집니다. –

0

파이썬에서는 단지 몇 줄에 regular expressions을 사용하여 이것을 해결할 수 있습니다. 문서를 살펴보십시오.

다음이 가진 아이디어는 re.split

+0

나는 정규식 모듈에 임시 결정을 가지고 있는데, 전에're.split'을 만났습니다. 그래서 파일을 큰 문자열로 읽은 다음 정규식 패턴을 사용하여 분할 할 수 있음을 알 수 있습니다. 아직 잘 모르는 부분은 새 작은 문자열을 각각 별도의 파일로 작성하여 스크립트를 수행하는 방법을 이해하는 것입니다. –

관련 문제