나는 디렉토리의 모든 파일을 읽고, 조건부 검사를 수행하고, 레코드(줄) 수에 따라 일부 파일을 분할하는 쉘 스크립트를 작성하고 있습니다.
abc.txt 파일을 abc(AA 또는 01).txt로 분할하고 싶습니다. (abc로 시작하고 .txt로 끝나는 한 아무 것도 상관하지 않습니다.)
이를 수행하는 쉬운 방법이 있습니까?
분할 명령을 사용하고 있습니다.
split -l $line_count $file $????
혼란스러워요. 대신 무엇을 사용해야 하나요? ? ?
나는 또한 다른 접근 방식에 열려 있지만 나머지 스크립트가 이미 준비되어 있으므로 ???만 변경하는 것을 선호합니다.
매우 감사합니다
답변1
노력하다:
split -l 5 --additional-suffix=.txt abc.txt abc
또는 문자 대신 숫자를 원하는 경우:
split -l 5 -d --additional-suffix=.txt abc.txt abc
abc
파일 이름 뒤에 추가하는 것은접두사.
옵션 을 접미사로 원했기 때문에 .txt
옵션을 추가했습니다 --additional-suffix=.txt
.
선택 사항은 문자 대신 숫자를 사용함을 -d
나타냅니다 .split
예
파일이 포함된 디렉터리부터 시작하겠습니다.
$ ls
abc.txt
이제 파일을 분할해 보겠습니다.
$ split -l 5 -d --additional-suffix=.txt abc.txt abc
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt
해결 방법 1: 셸 사용
GNU 분할의 현재 버전은 이 --additional-suffix
옵션을 지원하며 split
GNU coreutils의 일부입니다. 이는 결국 이 옵션을 모든 Linux 시스템에서 사용할 수 있음을 의미합니다.
split
현재 파일이 부족한 시스템의 경우 해결 방법은 파일을 만든 후 파일 이름을 바꾸는 것입니다. 예를 들어:
$ split -l 5 -d abc.txt abc
$ for f in ./abc??; do mv "$f" "$f.txt"; done
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt
위에서는 기본 접미사 길이 2가 적용되었다고 가정합니다. 그렇지 않은 경우 ?
사용 중인 접미사 길이와 일치하도록 숫자를 변경하십시오 . 예를 들어, 접미사 길이 5를 사용하는 경우:
$ split -l 5 -a 5 -d abc.txt abc
$ for f in ./abc?????; do mv "$f" "$f.txt"; done
$ ls
abc00000.txt abc00001.txt abc00002.txt abc00003.txt abc.txt
해결 방법 2: awk 사용
여기서 옵션은 l
각 분할 파일에 포함된 행 수를 지정하고 d
분할 파일 이름에 사용되는 비트 수를 지정합니다. d
충분히 큰지 확인하세요 .
$ awk -v l=5 -v d=2 '{n="0000" int((NR-1)/l); f="abc" substr(n,length(n)+1-d) ".txt"; if (f!=old) close(old); old=f; print >f}' abc.txt
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt