디렉터리에 있는 여러 텍스트 파일을 주어진 문자 수만큼 더 작은 텍스트 파일로 나누고 싶습니다. 예를 들어, 디렉토리의 모든 파일을 각각 100자의 더 작은 텍스트 파일로 나누기를 원합니다. 내가 이해한 바에 따르면 Linux의 분할 명령은 문자 수가 아닌 줄 수로만 작동하므로 이것이 작동하는지 확실하지 않습니다.
편집: 텍스트 파일을 단어 수로 분할하는 방법도 알고 싶습니다.
답변1
파일이 ASCII 텍스트인 경우 사용할 수 있습니다 split -b100
. 이는 100바이트, 항상 100개의 ASCII 문자를 의미합니다.
답변2
정확히 요청하신 내용은 아니지만 조정될 수 있습니다.
.txt
그러면 현재 디렉터리에서 접미사가 붙은 모든 파일이 처리됩니다. 각 파일에 대해(예 Cairo.txt
: ):
- 모든 공백을 개행 문자로 대체 하여
tr
한 줄에 한 단어로 구성된 간단한 목록이 생성됩니다. fmt
지정된 길이까지 정수 수의 단어를 한 줄에 묶는 데 사용됩니다 .split
이 줄을 일련의Cairo.seq.0000
파일 이름 으로 만드는 데 사용됩니다 .
테스트 가능성을 위해 너비 60과 줄 30을 사용했으며 입력 내용은 다음과 같이 생성된 일반 텍스트 매뉴얼 페이지 3개였습니다.
for cmd in tr fmt split; do man $cmd | col -b > $cmd.txt; done
스크립트는 다음과 같습니다.
#! /bin/bash
for fn in ./*.txt; do
Base="${fn%.txt}"
tr -s '[:space:]' '\n' < "${fn}" |
fmt -60 |
split -a 4 -d -l 30 - "./${Base}.seq."
done
fmt 명령에서 선 너비는 "60"입니다. 따라서 이 숫자를 100으로 설정하는 것이 좋습니다.
분할 명령에서 각 출력 파일의 줄 수는 "30"입니다. 파일당 한 줄을 원하는 것 같습니다. 그러나 이러한 작은 파일이 많이 생성됩니다. 100바이트 파일은 여전히 4096바이트 블록을 차지합니다.
단어 수는 변하지 않았지만 공백이 줄어들고 줄도 줄어든 것을 볼 수 있습니다.
paul $ wc *
29 214 1561 fmt.seq.0000
61 214 1832 fmt.txt
30 260 1665 split.seq.0000
15 101 780 split.seq.0001
94 361 2892 split.txt
30 263 1724 tr.seq.0000
18 126 929 tr.seq.0001
124 389 3282 tr.txt
410 1955 14821 total
paul $