csv 파일이 있는데 더 작은 파일로 나누어야 합니다. Split -l 20000 test.csv 문제 없습니다. 내 문제는 파일에 다른 헤더가 포함되어 있다는 것입니다. 예를 들어 +-1000줄마다 분할하고 싶지만 급여 헤더 다음에 분할해야 하며 새 파일은 cust 헤더로 시작해야 합니다.
고객 헤더,xxx,xxxxxx,xxxxxx txn 헤더,xxxx,xxx,,xxxx,xxxxx,,xxx 상세 제목,xxxx,xxxx,xxxxxx,xxxx,xxxx 상세 제목,xxxxxxxx,xxxxxxxxxx,xxx,, 지급명,,,,,xxxx,xxxxx 고객 헤더,xxx,xxxxxx,xxxxxx txn 헤더,xxxx,xxx,,xxxx,xxxxx,,xxx 상세 제목,xxxx,xxxx,xxxxxx,xxxx,xxxx 지급명,,,,,xxxx,xxxxx 고객 헤더,xxx,xxxxxx,xxxxxx txn 헤더,xxxx,xxx,,xxxx,xxxxx,,xxx 상세 제목,xxxx,xxxx,xxxxxx,xxxx,xxxx 지급명,,,,,xxxx,xxxxx
답변1
당신은 이것을 할 수 있습니다 awk
:
awk -vfilename=output -vcut=1000 '
BEGIN { nl=0; nf=1; f=filename "." nf;}
++nl >= cut && /^cust header,/ {
close(f); nl=0; f=filename "." ++nf}
{print > f}' < file
개수가 (여기서는 1000)보다 크고 cut
현재 줄이 로 끝나면 보이는 줄 수를 기록합니다 cust header,
. 출력 파일 이름은 output.1
, output.2
, ... ( filename
변수) 입니다.
답변2
ilkkachu의 솔루션은 깔끔하고 단일 실행 파일을 사용하며 아마도 정답일 것입니다. 하지만, awk
일까츄가 먼저 대답하지 않았다면, 내가 선택했을지도 모른다 csplit
. csplit
다음을 기준으로 텍스트 파일을 분할합니다.컨텍스트 라인(글쎄, 정규 표현식). 그런 다음 이미 알고 있는 유틸리티를 사용하여 해당 출력을 가져와 split
파일을 추가로 분할할 수 있습니다.
$ csplit --prefix="MySplit." test.csv '/^cust header,/' '{*}'
0
174
134
134
이는 블록당 바이트 수입니다(이 예에서는 무시함). 이제 각 청크를 반복 MySplit
하고 20k 요구 사항으로 더 분할합니다.
$ for i in MySplit.0*; do
split --additional-suffix=".$i" -l 20000 "$i"
done
예를 들어 -l 2
20k 대신 사용하면 특정 샘플의 최종 출력은 다음과 같습니다(확장자별로 정렬).
$ ls -lhXB
total 44K
-rw-r--r-- 1 hunteke hunteke 0 Jun 15 13:31 MySplit.00
-rw-r--r-- 1 hunteke hunteke 174 Jun 15 13:31 MySplit.01
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.01
-rw-r--r-- 1 hunteke hunteke 81 Jun 15 13:27 xab.MySplit.01
-rw-r--r-- 1 hunteke hunteke 26 Jun 15 13:27 xac.MySplit.01
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.02
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.02
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xab.MySplit.02
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.03
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.03
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xab.MySplit.03
-rw-r--r-- 2 hunteke hunteke 442 Jun 15 13:06 test.csv