파일을 한 줄씩 나누고 결과 파일 확장자를 제어 할 수 있습니다


28

파일 분할-분할에 대한 표준 명령이 있습니다.

예를 들어 단어 파일을 10000 줄의 여러 청크로 나누려면 다음을 사용할 수 있습니다.

split -dl 10000 words wrd

wrd.01, wrd.02 등의 여러 파일을 생성합니다.

그러나 해당 파일의 특정 확장자를 원합니다-예를 들어 wtd.01.txt, wrd.02.txt 파일을 얻고 싶습니다.

그것을 할 수있는 방법이 있습니까?

답변:


11

로하지는 split않지만 나중에 쉽게 이름을 바꾸거나 다음에서 수행 할 수 있습니다 awk.

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile

좋아 보이지만 작동하지 않습니다. 양식에서 "">> 리디렉션의 표현식에 null 문자열 값이 있습니다. "에 대해 불평하고"file "이"filename "으로"변경된 "경우 wrd. {file number}. {line number} 형식의 파일을 출력합니다. .txt (많은
것들을 인용하십시오.)

@Rogach 죄송합니다. 테스트하지 않았으므로 awk가 정수 나누기를하지 않는 것을 잊었습니다. 나는 이것을 테스트했다.
케빈

49

당시에는 사용할 수 없었지만 최신 버전 ( ≥ 8.16) gnu split에서는 --additional-suffix스위치를 사용 하여 결과 확장을 제어 할 수 있습니다 . 보낸 사람 man split:

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

따라서 해당 옵션을 사용할 때 :

split -dl 10000 --additional-suffix=.txt words wrd

결과 조각은 다음으로 자동 종료됩니다 .txt.

wrd00.txt
wrd01.txt
.........

3
mac에서 작동하지 않음
ericgu

2
나는 당신의 풍자를 좋아합니다. 나는 애플 세계에서 유닉스 n00b입니다. OS X Yosemite를 사용하고 있으며 다른 사람들이 내가했던 것처럼 충돌하고 타는 것을 원하지 않았습니다. 문서에서 테스트하고 검토 했으며이 매개 변수가 없습니다. 뭔가를 놓쳤을 수도 있습니다. developer.apple.com/library/mac/documentation/Darwin/Reference/…
ericgu 2015

5
@swiftshokunin-내 대답은의 gnu split일부 와 관련 이 gnu coreutils있습니다. 당신이 coreutils통해 설치하는 경우에도 OSX에서 사용할 수 homebrew있지만 기본적으로 OSX에서 gnu유틸리티는 g이름 앞에 (예 : gstat대신 stat) 접두어를 붙여서 다음과 같이 호출 gsplit하거나 원하는 경우 여기에 따라 PATH를 변경 하십시오 . splitOSX 를 통해 사용하기 위해 split). HTH.
don_crissti

1
좋은 대답입니다. OS X에서는 gsplit숫자 접미사 (-d)가 작동하도록하는 데 사용하십시오.
브렌트 파우스트

1
와우, 나는 gsplit이 있다는 것을 몰랐다. 아마 위에서 언급 한 coreutils에서 왔으며-추가 접미사가 있습니다. 이 솔루션 :) 의견을 모두에게 감사합니다
의 Łukasz Rysiak을

13

이러한 작업은 셸로 가장 잘 관리됩니다. split을 사용한 다음 간단한 루프를 작성하여 파일 이름을 바꿉니다. 예 :

for file in wrd.*
do
    mv "$file" "$file.txt"
done

wrd.01, wrd.02 등의 파일 이름을 변경하여 모두 .txt 확장자를 갖습니다.


그것은 명백하지만 bash 스크립트의 간결성을 깨뜨릴 것입니다.
Rogach

1
유닉스 철학은 작업을 수행하기 위해 결합한 간단한 도구 세트를 제공하는 것입니다. "bash 스크립트의 간결함"은 귀하의 질문에 명시된 요구 사항이 아닙니다.
Kyle Jones

7
추신 : split+mv콤보는 1 천만 줄 입력 파일 (75MB)에서 (약 3 초18 초) 보다 6 배 이상 빠릅니다 ... 각 줄의 텍스트는 자체 줄 번호였습니다 ... "명백한":)awk
Peter.O

3
PPS : 방금 이것에 대해 좀 더 조사해 보았습니다. 속도 차이는 생성 된 파일 수와 출력 파일 수에 관계없이 각 라인마다 서식 및 산술 계산 수와 관련이 있습니다 ... 위 예제와 동일한 입력 파일 사용 : 100 배 적은 수의 파일은, split + mv이다 (75) 보다 배 빠른 awk있을 때 : 100 배 이상 , 파일 split + mv1.5 배보다 더 빨리 awk. 그래서 나 에게이 split + mv방법은 승리합니다. 그것은 양심과 같으며 (아마도 더 그렇습니다)보다 빠릅니다 awk.
Peter.O

1
5 줄의 길이가 걱정된다면 대신 다음을 시도하십시오. for file in wrd.*; do mv "$file" "$file.txt"; done:)
Tony
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.