压缩文件上记录计数和 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

moreutilsDebian(和其他地方)上的软件包包含一个通用 utils 的小宝库。

其中之一是pee(1)。它就像tee(1)但不将输出写入(多个)文件,而是通过管道将其传递给(多个)命令。使用起来极其简单直观;例如

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

答案2

你可以使用teebash 的流程替代这:

$ 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 -cgzip -d -c或。zcat

答案4

如果使用zsh

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

由于 stdout 被重定向两次,zsh 将其替换为通向内部 ing 进程的管道tee,该进程将输出发送到wc -lcksum

请注意,wccksum是同时运行的,并且哪一个首先输出结果是不确定的。

相关内容