패턴에 따라 파일을 여러 파일로 분할 [중복]

패턴에 따라 파일을 여러 파일로 분할 [중복]

수백 줄 길이의 큰 파일이 있습니다. 파일은 "ABC"와 같은 특정 식별자에 따라 섹션으로 구분됩니다. 이 "ABC" 줄은 6번 나타나므로 6개의 출력 파일이 필요합니다. 나는 Split과 awk에 익숙하지만 내가 설명한 작업을 수행하기 위한 명령줄을 만들 수 없는 것 같습니다. 어떤 아이디어가 있습니까?

이것은 예이다

ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1

ABC가 새 파일의 첫 번째 줄이고 다음 ABC가 발견되기 전에 끝나는 세 개의 파일을 원합니다.

답변1

사용csplit

csplit -z somefile /ABC/ '{*}'

기본적으로 출력 파일은 xx00, xx01, ... 이지만 원하는 경우 형식과 번호 매기기를 변경할 수 있습니다. 참조man csplit

답변2

NEEDLE=ABC
HAYSTACK=/path/to/bigfile
csplit -f splitfile_ $HAYSTACK /$NEEDLE/ "{$(($(grep -c -- $NEEDLE $HAYSTACK)-1))}"
for file in splitfile_*; do
    sed --in-place "s/$NEEDLE//" $file
done

태그 줄 인스턴스 수에 관계없이 위 코드는 필요에 따라 파일을 분할한 다음 결과 파일에서 태그를 제거합니다. 출력 파일은 splitfile_00, splitfile_01등 으로 호출됩니다.

호출이 끝날 때 압축 풀기 csplit: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"서브쉘을 사용하여 grep파일에 있는 태그의 인스턴스 수를 가져오고 1을 뺍니다. 이는 csplit분할할 수 있는 정확한 수를 알려줍니다.

기록된 대로 마커가 데이터에 나타나면 상황이 배 모양으로 바뀔 수 있습니다.

관련 정보