대용량 파일이 있어서 사용 가능한 부분으로 분할해야 합니다. (레코드 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