Unix에서 대용량 파일을 여러 파일로 분할

Unix에서 대용량 파일을 여러 파일로 분할

여러 줄(9074줄)이 포함된 파일이 있고 파일을 남은 줄 수를 포함하는 마지막 파일을 제외하고 동일한 줄 수를 포함하는 10개의 파일로 분할하고 싶습니다.

split -l `wc -l myfile | awk '{print $1/10}'` myfile
split: invalid number of lines: ‘907.4’

마지막 파일에 907+4 줄을 포함하고 싶습니다

답변1

당신은해야합니다정수-l나눗셈으로 얻은 매개변수 값입니다 split. 쉘은 정수 나누기에 적합합니다.

lines_number=$(wc -l < file)
split -l $((lines_number / 10)) file
wc -l x*
  907 xaa
  907 xab
  907 xac
  907 xad
  907 xae
  907 xaf
  907 xag
  907 xah
  907 xai
  907 xaj
    4 xak
 9074 total

이를 사용하려면 awk정수를 인쇄해야 합니다.

wc -l file | awk '{print int($1/10)}'
907

마지막 두 파일을 연결해야 합니다. 모두 동일한 빈 디렉터리에 출력한다고 가정하면 다음을 수행할 수 있습니다.

printf "%s\n" x* | tail -n2 | xargs cat > last_file

wc -l < last_file
911

위에서 우리는 glob 일치가 알파벳 순서로 새 파일을 가져오고 분할이 출력 파일의 이름을 해당 순서로 지정한다는 것을 알고 있습니다.


split참고: 또한 다음과 같이 의 출력 파일에 사용자 정의 접두사와 숫자 인덱스를 사용하고 싶습니다 .

split -d -l 907 file new_file

참고: 접미사 길이의 기본값은 2이므로( man split및 참조 -a) split유사한 이름의 파일은 100(3자리 접미사 길이) 미만인 경우 알파벳순으로 다시 정렬됩니다 new_file00. new_file01숫자 접미사(사람이 쉽게 읽을 수 있도록)와 알파벳 순서를 모두 갖는 또 다른 옵션은 접미사 길이를 -a적절한 값으로 설정하는 것입니다.


전체 프로세스를 작은 스크립트에 포함하려면 이렇게 하면 됩니다. 또한 모듈러스가 0인지 확인하는 기능도 추가했습니다. 이 경우 출력 파일을 수정하지 않습니다.

#!/bin/bash
f="file"
prefix="new_file"

lines_number=$(wc -l < "$f")
split -d -l $((lines_number / 10)) "$f" "$prefix"

if ((lines_number % 10 != 0)); then
    last_file=$(printf "%s\n" "$prefix"* | tail -1)
    pre_last_file=$(printf "%s\n" "$prefix"* | tail -2 | head -1)
    cat "$last_file" >> "$pre_last_file" && rm -- "$last_file"
fi

관련 정보