Come ottenere poche righe da un file compresso .gz senza decomprimerlo


89

Come ottenere le prime righe da un file gziped? Ho provato zcat, ma genera un errore

zcat CONN.20111109.0057.gz|head
CONN.20111109.0057.gz.Z: A file or directory in the path name does not exist.

Risposte:


149

zcat(1)può essere fornito da uno compress(1)o da gzip(1). Sul tuo sistema, sembra compress(1)che stia cercando un file con .Zun'estensione.

Passa a gzip -cdal posto di zcate il tuo comando dovrebbe funzionare bene:

 gzip -cd CONN.20111109.0057.gz | head

Spiegazione

   -c --stdout --to-stdout
          Write output on standard output; keep original files unchanged.  If there are several input files, the output consists of a sequence of independently compressed members. To obtain better compression, concatenate all input files before compressing
          them.

   -d --decompress --uncompress
          Decompress.

7
A proposito, se sei seduto con un * .tar.gz, questo ti aiuterà: tar -xzOf some_huge_file.tar.gz | head
demaniak

Vecchio thread ma questo produce un pipe rotto con stato di uscita 1 con file gz di grandi dimensioni. Qualche soluzione alternativa pulita?
kaligne

2
La soluzione migliore e più semplice che ho trovato finora: usa zless file.gz | head. zmoreti lascia ancora con la pipa rotta. zlesssembra essere la strada da percorrere.
kaligne

zless non esce ... almeno non sul mio file di grandi dimensioni. Sto ancora cercando un modo per farlo senza errori di pipe rotti ...
Freek



2

Se è necessario un intervallo continuo di linee , un'opzione potrebbe essere:

gunzip -c file.gz | sed -n '5,10p;11q' > subFile

dove le righe comprese tra la 5a e la 10a riga (entrambe comprese) di file.gzvengono estratte in un nuovo file subFile. Per le sedopzioni, fare riferimento al manuale .

Se ogni, diciamo, la quinta riga è richiesta:

gunzip -c file.gz | sed -n '1~5p;6q' > subFile

che estrae la 1 ° linea e salta su 4 linee e sceglie la 5 ° linea e così via.


0

Questo frammento di awk ti consentirà di mostrare non solo le prime righe, ma un intervallo che puoi specificare. Aggiungerà anche i numeri di riga di cui avevo bisogno per il debug di un messaggio di errore che punta a una certa riga in basso in un file gzip.

gunzip -c file.gz | awk -v from=10 -v to=20 'NR>=from { print NR,$0; if (NR>=to) exit 1}'

Ecco lo snippet di awk utilizzato nell'unico rivestimento sopra. In awk NR è una variabile incorporata (Numero di record trovati finora) che di solito è equivalente a un numero di riga. le variabili from e to vengono prelevate dalla riga di comando tramite le opzioni -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.