여러 줄(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