bash 스크립트: 이러한 작업을 수행하는 보다 우아한 방법:

bash 스크립트: 이러한 작업을 수행하는 보다 우아한 방법:

다음 세 가지 파일이 있습니다.

File.txt.7z = 5.4GB
파일 1.txt.7z = 251M
파일 2.txt.7z = 7.7M

디렉토리에 있는 유일한 파일은 다음과 같습니다.

$ tree
.
├── file.txt.7z
├── file-1.txt.7z
└── file-2.txt.7z

나는 원해요

  • 파일 압축 풀기
  • 하나의 파일로 병합
  • 병합된 파일을 500,000개의 라인 파일로 분할
  • 결과는 ".txt" 확장자를 가진 많은 파일입니다.

이제 다음과 같이 구현합니다.

p7zip -d "*.txt.7z"
cat file-1.txt >> file.txt
rm file-1.txt
cat file-2.txt >> file.txt
rm file-2.txt
split -l 500000 file.txt
for f in *; do mv "$f" "$f.txt"; done

어떻게 하면 좀 더 우아한 방식으로 이를 달성할 수 있나요?

답변1

7za+split솔루션(단일 파이프라인):

7za e "*.7z" -so 2> /dev/null | split -l500000 --additional-suffix=".txt" --numeric-suffixes=1 - "file"

--7za옵션:

  • e- 아카이브 추출/압축 해제

  • -so- STDOUT에 콘텐츠 쓰기


--split옵션:

  • --additional-suffix=".txt".txt- 생성된 모든 파일 이름에 접미사를 추가합니다.

  • --numeric-suffixes=1- 다음으로 시작하는 숫자 접미사를 사용하세요.1

  • -(하이픈) - STDIN(표준 입력)에서 데이터를 읽습니다.

  • "file"- 모든 결과 파일 이름에 대한 공통 접두사


위 명령은 다음 file01.txt과 같은 이름 지정 형식으로 파일을 생성합니다 file02.txt.

답변2

--filter배관 및 포장 풀기 옵션을 사용할 수 있습니다 split.

p7zip -d *.txt.7z
cat file.txt file-1.txt file-2.txt | split -l 500000 --filter='> $FILE.txt'
rm file*

다음에 대한 문서는 다음과 같습니다 --filter option.

‘--filter=COMMAND’
     With this option, rather than simply writing to each output file,
     write through a pipe to the specified shell COMMAND for each output
     file.  COMMAND should use the $FILE environment variable, which is
     set to a different output file name for each invocation of the
     command.  For example, imagine that you have a 1TiB compressed file
     that, if uncompressed, would be too large to reside on disk, yet
     you must split it into individually-compressed pieces of a more
     manageable size.  To do that, you might run this command:

          xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-

     Assuming a 10:1 compression ratio, that would create about fifty
     20GiB files with names ‘big-aa.xz’, ‘big-ab.xz’, ‘big-ac.xz’, etc.

tee모든 출력을 포함하는 파일을 유지해야 하는 경우 표준 입력을 표준 출력으로 복사하고 인수로 제공된 파일을 복사하는 를 사용할 수 있습니다 .

cat file.txt file-1.txt file-2.txt |
    tee all.txt |
    split -l 50000 --filter='> $FILE.txt'

관련 정보