大文件上的 cat 不起作用

Lin*_*ket 3 shell compression cat

我试图将四个大文件连接成两个。文件 *_1P.gz 包含的行数与对应的 *_2P.gz 行数相同。

文件A_1P.gzA_2P.gz两者都包含1104507560行。
文件B_1P.gzB_2P.gz两者都包含1182136972行。

但是,cat A_1P.gz B_1P.gz > C_1P.gz| wc -l返回186974687行和cat A_2P.gz B_2P.gz > C_2P.gz| wc -l返回182952523行,因此两者不仅比两个输入文件小得多(它们的长度应该超过 2B 行,而小于 2M),而且它们的行数也不同。运行的命令没有显示任何错误。

我无法理解发生了什么,我也生成了这四个大文件cat并且它运行正常。

  • 可能是什么问题?
  • 我还有什么其他选项可以在不使用的情况下连接 gzipped 文件cat

我在 CentOS 服务器上工作。我还有 197G 的空间,所以这应该不是问题(或者至少应该显示错误)。

Kus*_*nda 11

请注意,文件是压缩的。因此,您不能wc -l直接在文件上使用来计算其中的原始行数,而无需先解压缩它们。

可以cat用于连接这些类型的压缩文件,因为生成的文件本身就是一个有效的压缩文件。稍后解压缩它会产生一个文件,该文件是来自两个文件的未压缩数据的串联。

cat A_1P.gz B_1P.gz >C_1P.gz
Run Code Online (Sandbox Code Playgroud)

要计算 中的行数C_1P.gz

zcat C_1P.gz | wc -l
Run Code Online (Sandbox Code Playgroud)

或者

gunzip -c C_1P.gz | wc -l
Run Code Online (Sandbox Code Playgroud)

或者

gzip -dc C_1P.gz | wc -l
Run Code Online (Sandbox Code Playgroud)

但请注意,我们需要解压缩文件以计算行数,否则我们将计算文件压缩算法作为压缩数据的一部分生成的“随机”换行符(这些与未压缩文件中的行无关)。