![패턴에 따라 파일을 여러 파일로 분할 [중복]](https://linux55.com/image/83790/%ED%8C%A8%ED%84%B4%EC%97%90%20%EB%94%B0%EB%9D%BC%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%B6%84%ED%95%A0%20%5B%EC%A4%91%EB%B3%B5%5D.png)
수백 줄 길이의 큰 파일이 있습니다. 파일은 "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
분할할 수 있는 정확한 수를 알려줍니다.
기록된 대로 마커가 데이터에 나타나면 상황이 배 모양으로 바뀔 수 있습니다.