압축 파일의 레코드 수 및 cksum

압축 파일의 레코드 수 및 cksum

gz 형식의 40GB 파일이 있습니다. cksum이 파일의 압축되지 않은 형식의 레코드 수를 찾고 싶습니다 . 내 방법 중 하나는 다음과 같습니다.

  1. 압축이 풀린 파일 사용gunzip
  2. 파일의 압축을 풀려면 wc다음 명령을 사용하십시오.cksum
  3. 파일 압축을 다시 사용하십시오 gzip.

이 방법의 문제점은 파일을 추출하고 압축하는 데 많은 시간이 걸린다는 것입니다. 약 30~40분 정도 소요될 수 있습니다. 또 다른 접근 방식은 zcat레코드 수를 계산 하는 것입니다 .cksum

  1. zcat <file name> | wc -l
  2. zcat <file name> | cksum

이 방법은 시간이 덜 걸릴 수 있지만 zcat동일한 파일에 대해 두 번 사용됩니다. 더 좋은 방법이 있나요? 어쩌면 레코드 수 합계를 찾는 데 명령이 사용되는 것일까요 cksum?

답변1

moreutils데비안(및 다른 곳)의 패키지에는 공통 유틸리티의 작은 보물 창고가 포함되어 있습니다.

그 중 하나는 입니다 pee(1). tee(1)이는 출력을 (여러) 파일에 쓰는 대신 (여러) 명령으로 파이프하는 것과 비슷합니다 . 사용이 매우 간단하고 직관적입니다.

$ zcat foo.gz | pee md5sum wc
0a22adb99b92b4c5ad6beba9694238a3  -
    403    2372   27766

답변2

tee배쉬를 사용할 수 있습니다프로세스 교체이것:

$ zcat foo.gz | tee >(md5sum >&2) | wc
6f869e2acc27a0330b10d9ffa6655e7b  -
  36568   45710 2743552

파일의 압축을 한 번 풀고 압축이 풀린 데이터를 tee입력 파일로 파일에 전달하고 md5sum파일에 출력을 표준 오류로 인쇄하도록 지시한 다음(캡처되지 않음 | wc) 출력도 에 전달합니다 wc.

답변3

디스크 공간은 문제가 되지 않는 것 같으므로 가장 쉬운 방법은 임시 파일에 파일의 압축을 풀고 해당 파일에 대해 두 가지 명령을 실행하는 것입니다. 완료되면 임시 파일을 삭제합니다.

gunzip -c file.gz >tmpname
wc -l tmpname
cksum tmpname
rm tmpname

원하는 경우 또는 gunzip -c로 바꿀 수 있습니다 gzip -d -c.zcat

답변4

사용하는 경우 zsh:

{zcat file.gz} > >(wc -l) > >(cksum)

stdout은 두 번 리디렉션되므로 zsh는 이를 내부 ing 프로세스에 대한 파이프로 대체하여 tee출력을 wc -land 로 보냅니다 cksum.

wc및 은 동시에 cksum실행되며 어느 것이 먼저 결과를 출력하는지 정의되지 않았습니다.

관련 정보