awk나 Sed를 사용하여 수행할 수 있나요? 큰 파일을 작은 파일로 분할합니다. 두 마커 사이의 선

awk나 Sed를 사용하여 수행할 수 있나요? 큰 파일을 작은 파일로 분할합니다. 두 마커 사이의 선

awkor 를 사용하여 이와 같은 작업을 수행 할 수 있습니까 sed? ...또는 perlOR을 사용해야 합니까 python(아니면 C++가 가장 편하기 때문에 C++를 사용하는 것 같습니다)?

카테고리와 하위 카테고리의 항목 목록이 포함된 파일이 있다고 가정해 보겠습니다.

* 새
  - 참새
  - 까치
  - 까마귀
  - 앵무새
* 포유류
  *애완동물
    - 개
    - 고양이
    - 토끼
  * 해충
    - 쓰레기 팬더
    - 스컹크
* 물고기
  - 송어
  - 청어
  - 연어
(...)

이는 새, 포유류 및 물고기(포유류 아래의 두 하위 카테고리를 분할할 필요가 없음)의 세 가지 파일로 분할되어야 하며 한 카테고리와 다음 카테고리(또는 파일 끝) 사이의 콘텐츠를 포함합니다. 또 다른 접근 방식은 첫 번째 범주/파일로 시작하여 두 번째 범주를 파일로 출력한 다음 반복하기 전에 원본 파일에서 자동/수동으로 제거하는 것입니다.

기본적으로 제가 알고 싶은 것은 두 태그 사이(여기서는 두 태그 사이 ) 에 무엇인가를 만들 awk거나 출력하는 방법입니다.sed*

답변1

*카테고리 줄의 첫 번째 문자라고 가정하면

$ awk '/^\*/{close(f); f=$2; next} f{print > f}' file

$ head Birds Mammals Fish
==> Birds <==
  - Sparrow
  - Magpie
  - Crow
  - Parrot

==> Mammals <==
  * Pets
    - Dog
    - Cat
    - Rabbit
  * Pests
    - Trash-panda
    - Skunk

==> Fish <==
  - Trout
  - Herring
  - Salmon

답변2

csplit 유틸리티는 이 예제에 표시된 대로 컨텍스트에 따라 파일을 분할하는 데 사용됩니다.

csplit -sz yourfile '/^[*]/' '{*}'
for f in xx*
do {
  dst=$(head -n 1 -|cut -d' ' -f2)
  cat - > "$dst"
} < "$f"
done
head Birds Fish Mammals
==> Birds <==
  - Sparrow
  - Magpie
  - Crow
  - Parrot

==> Fish <==
  - Trout
  - Herring
  - Salmon

==> Mammals <==
  * Pets
    - Dog
    - Cat
    - Rabbit
  * Pests
    - Trash-panda
    - Skunk

관련 정보