패턴에 따라 파일을 여러 파일로 분할

패턴에 따라 파일을 여러 파일로 분할

몇백 줄 길이의 큰 파일이 있습니다. 이 파일은 특정 식별자(예: '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분할할 개수를 정확히 알려줍니다.

작성된 대로 마커가 데이터 내에 나타나면 상황이 배 모양으로 나타날 수 있습니다.

관련 정보