페이지의 데이터를 읽고 별도의 파일에 저장

페이지의 데이터를 읽고 별도의 파일에 저장

페이지별로 구분된 데이터가 포함된 거대한 텍스트 파일이 있습니다. 예를 들어, 텍스트의 형식은 다음과 같으며 페이지별로 줄을 읽고 각 페이지를 별도의 파일에 저장하고 싶습니다.

Page 1
 line 1
 line 2
 line 3
 line 4
 line 5
Page 2
 line 1
 line 2
 line 3
 line 4
 line 5
Page 3
 line 1
 line 2
 line 3
 line 4
 line 5

답변1

해결책:

awk '/^Page [0-9]+$/ {N = $2}; {print > "page"N}' pages

테스트 실행:

==> page1 <==
 line 1
 line 2
 line 3
 line 4
 line 5

==> page2 <==
 line 1
 line 2
 line 3
 line 4
 line 5

==> page3 <==
 line 1
 line 2
 line 3
 line 4
 line 5

그러나 수천 개의 페이지가 있는 경우 일부 awk구현에서는 열린 파일 수에 제한이 있을 수 있습니다. 새 헤더가 발견되면 이전 페이지의 파일을 닫아 이 문제를 해결할 수 있습니다. 파일 이름의 숫자를 0으로 채워 ls오름차순으로 표시할 수도 있습니다.

awk '
  /^Page [0-9]+$/ {close(file); file = sprintf("page%04d", $2)}
  {print > file}' pages

입력이 페이지당 한 번만 포함된다고 가정합니다.Page n

답변2

awk다른 솔루션은 다음 이 필요하기 때문에 원래 솔루션만큼 우아하지 않습니다 .

  • 페이지당 행 수를 알아보세요.
  • 이 번호는 모든 페이지에서 동일하게 유지되어야 합니다.

    split -l 6 -a 2 -d input page_
    

여기서 6은 페이지당 행 수입니다. 제목 행 1개 + 데이터 행 5개

답변3

사용 csplit:

$ csplit -s -f page- file '/^Page/' '{1}'
$ ls
file    page-00 page-01 page-02
$ cat page-00
Page 2
 line 1
 line 2
 line 3
 line 4
 line 5
$ cat page-01
Page 2
 line 1
 line 2
 line 3
 line 4
 line 5
$ cat page-02
Page 3
 line 1
 line 2
 line 3
 line 4
 line 5

csplit유틸리티는 마지막 매개변수를 기반으로 지정된 파일을 분할합니다. 여기에서는 각 일치 항목에 대해 주어진 정규식을 기반으로 파일을 분할 하도록 지시합니다 /^Page/. GNU의 경우 대신 사용할 수 있습니다 (위의 예는 OpenBSD용으로 작성되었습니다 ).{1}csplitcsplit{*}{1}csplit

답변4

주문하다:

awk '$0 ~/Page 1/{f=1}$0 ~/Page 2/{f=0}f' o.txt > firstfile
 awk '$0 ~/Page 2/{f=1}$0 ~/Page 3/{f=0}f' o.txt > secondfile
awk '/Page 3/,/,/{print $0}' o.txt >thirdfile

산출

een@praveen:~$ awk '$0 ~/Page 1/{f=1}$0 ~/Page 2/{f=0}f' o.txt > firstfile
Page 1
 line 1
 line 2
 line 3
 line 4
 line 5
praveen@praveen:~$ awk '$0 ~/Page 2/{f=1}$0 ~/Page 3/{f=0}f' o.txt > secondfile
Page 2
 line 1
 line 2
 line 3
 line 4
 line 5



awk '/Page 3/,/,/{print $0}' o.txt >thirdfile
Page 3
 line 1
 line 2
 line 3
 line 4
 line 5
praveen@praveen:

~$

관련 정보