cat em arquivos grandes não funciona

3

Estou tentando concatenar quatro arquivos grandes em dois. Os arquivos * _1P.gz contêm a mesma quantidade de linhas que o correspondente * _2P.gz.

Os arquivos A_1P.gz e A_2P.gz contêm 1104507560 linhas.
Os arquivos B_1P.gz e B_2P.gz contêm 1182136972 linhas.

No entanto, cat A_1P.gz B_1P.gz > C_1P.gz| wc -l retorna 186974687 linhas e cat A_2P.gz B_2P.gz > C_2P.gz| wc -l retorna 182952523 linhas, portanto ambos não são apenas menores do que os dois arquivos de entrada (eles devem ter mais de 2B linhas e são menos de 2M), mas também têm um número diferente de linhas. O comando foi executado sem mostrar erros.

Não consigo entender o que está acontecendo. Também geramos esses quatro arquivos grandes com cat e funcionou corretamente.

  • Qual poderia ser o problema?
  • Que outras opções eu tenho para concatenar arquivos gzipados sem usar cat ?

Estou trabalhando em um servidor CentOS. Eu ainda tenho 197G de espaço, então isso não deveria ser um problema (ou deveria mostrar um erro, pelo menos).

    
por LinuxBlanket 19.07.2018 / 15:24

1 resposta

11

Note que os arquivos são compactados . Portanto, você não pode usar wc -l nos arquivos diretamente para contar o número original de linhas neles sem descompactá-los primeiro.

Não há problema em usar cat para concatenar esses tipos de arquivos compactados, pois o arquivo resultante é um arquivo compactado válido em si. A descompactação posterior resultaria em um arquivo que é a concatenação dos dados não compactados dos dois arquivos.

cat A_1P.gz B_1P.gz >C_1P.gz

Para contar o número de linhas em C_1P.gz :

zcat C_1P.gz | wc -l

ou

gunzip -c C_1P.gz | wc -l

ou

gzip -dc C_1P.gz | wc -l

mas note que precisamos descompactar o arquivo para contar as linhas, caso contrário, estaremos contando as novas linhas "aleatórias" que o algoritmo de compactação de arquivos gera como parte dos dados compactados (eles não têm nada a ver com as linhas seu arquivo descompactado).

    
por 19.07.2018 / 15:31