
몇백 줄 길이의 큰 파일이 있습니다. 이 파일은 특정 식별자(예: '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
분할할 개수를 정확히 알려줍니다.
작성된 대로 마커가 데이터 내에 나타나면 상황이 배 모양으로 나타날 수 있습니다.