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.