페이지별로 구분된 데이터가 포함된 거대한 텍스트 파일이 있습니다. 예를 들어, 텍스트의 형식은 다음과 같으며 페이지별로 줄을 읽고 각 페이지를 별도의 파일에 저장하고 싶습니다.
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}
csplit
csplit
{*}
{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:
~$