gz 형식의 40GB 파일이 있습니다. cksum
이 파일의 압축되지 않은 형식의 레코드 수를 찾고 싶습니다 . 내 방법 중 하나는 다음과 같습니다.
- 압축이 풀린 파일 사용
gunzip
- 파일의 압축을 풀려면
wc
다음 명령을 사용하십시오.cksum
- 파일 압축을 다시 사용하십시오
gzip
.
이 방법의 문제점은 파일을 추출하고 압축하는 데 많은 시간이 걸린다는 것입니다. 약 30~40분 정도 소요될 수 있습니다. 또 다른 접근 방식은 zcat
레코드 수를 계산 하는 것입니다 .cksum
zcat <file name> | wc -l
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 -l
and 로 보냅니다 cksum
.
wc
및 은 동시에 cksum
실행되며 어느 것이 먼저 결과를 출력하는지 정의되지 않았습니다.