有一个gz格式的40GB文件。我想查找cksum
未压缩格式的该文件的记录数。我的一种方法是:
- 使用解压缩文件
gunzip
- 对解压文件使用
wc
,命令cksum
- 使用 再次压缩文件
gzip
。
这种方法的问题是提取和压缩文件将花费大量时间。可能需要 30-40 分钟左右。另一种方法可能是用来zcat
计算记录数和cksum
zcat <file name> | wc -l
zcat <file name> | cksum
这种方法可能需要更少的时间,但zcat
对同一个文件使用两次。有更好的方法吗?可能正在使用一个命令来查找记录计数和cksum
?
答案1
moreutils
Debian(和其他地方)上的软件包包含一个通用 utils 的小宝库。
其中之一是pee(1)
。它就像tee(1)
但不将输出写入(多个)文件,而是通过管道将其传递给(多个)命令。使用起来极其简单直观;例如
$ zcat foo.gz | pee md5sum wc
0a22adb99b92b4c5ad6beba9694238a3 -
403 2372 27766
答案2
你可以使用tee
bash 的流程替代这:
$ 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
和cksum
。
请注意,wc
和cksum
是同时运行的,并且哪一个首先输出结果是不确定的。