텍스트 열의 값을 기반으로 대용량 파일을 여러 개의 작은 파일로 분할하는 방법은 무엇입니까?

텍스트 열의 값을 기반으로 대용량 파일을 여러 개의 작은 파일로 분할하는 방법은 무엇입니까?

대용량 파일이 있어서 사용 가능한 부분으로 분할해야 합니다. (레코드 3억 5천만 개) 중요한 점은 두 번째 열 값이 다음 파일로 오버플로될 수 없다는 것입니다.

읽고 쓰는 데 시간이 너무 오래 걸리고 분할 명령이 작동하지 않습니다. 제가 할 수 있는 다른 일이 있나요?

10개의 레코드가 포함된 샘플 파일은 3개의 출력 파일로 분할됩니다.

aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,24,xxx

출력 1:

aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx

출력 2:

aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx

출력 3:

aa,24,xxx

답변1

그리고 awk:

awk -F, '$2 != ref { i++; ref = $2 } { print $0 >"output" i }' input

두 번째 열 을 input기준으로 파일로 분할 됩니다 output1.output2

출력 파일당 줄 수를 제한하려면 다음을 수행하십시오.

awk -F, '$2 != ref { i++; ref = $2; lines = 0 } lines >= 1000 { i++; lines = 0 } { print $0 >"output" i; lines++ }' input

두 번째 열의 제약 조건을 고려하여 최대 1000개의 행을 포함하는 출력 파일이 생성됩니다.

다음은 지정된 제한(이 경우 1000개 행, 50000000개 행을 사용할 수 있음)에 도달한 후 두 번째 열의 다음 변경 시 분할되는 또 다른 변형입니다.

awk -F, 'BEGIN { change = 1 } change && $2 != ref { i++; ref = $2; change = 0; lines = 0 } lines >= 1000 { change = 1 } { print $0 >"output" i; lines++; ref = $2 }' input

답변2

사용밀러:

$ mlr --nidx --fs comma put -q 'tee > $2 . ".dat", $*' ten.dat

$ cat 22.dat
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx

$ cat 23.dat
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx

$ cat 24.dat
aa,24,xxx

관련 정보