Jak uzyskać kilka wierszy ze skompresowanego pliku .gz bez dekompresji

89

Jak pobrać kilka pierwszych wierszy z pliku gziped? Próbowałem zcat, ale generuje błąd

zcat CONN.20111109.0057.gz|head
CONN.20111109.0057.gz.Z: A file or directory in the path name does not exist.
Govind Kailas
źródło

Odpowiedzi:

149

zcat(1)mogą być dostarczane przez compress(1)lub przez gzip(1). Wygląda na to, że w Twoim systemie compress(1)szuka pliku z .Zrozszerzeniem.

Przełącz się gzip -cdna zamiast, zcata twoje polecenie powinno działać poprawnie:

 gzip -cd CONN.20111109.0057.gz | head

Wyjaśnienie

   -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.
sarnold
źródło
7
BTW, jeśli siedzisz z * .tar.gz, to ci pomoże: tar -xzOf some_huge_file.tar.gz | head
demaniak
Stary wątek, ale tworzy zepsuty potok ze statusem wyjścia 1 z dużymi plikami gz. Jakieś czyste obejście?
kaligne
2
Najlepsze i najłatwiejsze obejście, jakie do tej pory znalazłem: użyj zless file.gz | head. zmorenadal pozostawia cię z pękniętą rurą. zlesswydaje się być właściwą drogą.
kaligne
zless nie wychodzi ... przynajmniej nie w moim dużym pliku. Ciągle szukam sposobu na zrobienie tego bez błędów zepsutej rury ...
Freek
14

W niektórych systemach (np. Mac) musisz użyć gzcat.

Marcelo Cantos
źródło
11

Na komputerze Mac musisz użyć <z zcat:

zcat < CONN.20111109.0057.gz|head

punkrockpolly
źródło
2

Jeśli potrzebny jest ciągły zakres linii , jedną z opcji może być:

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

gdzie linie między piątą a dziesiątą linią (obie włącznie) file.gzsą wyodrębniane do nowej subFile. Informacje na temat sedopcji można znaleźć w instrukcji .

Jeśli każdy, powiedzmy, piąty wiersz jest wymagany:

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

który wyodrębnia pierwszą linię i przeskakuje przez 4 linie, wybiera piątą linię i tak dalej.

Inżynier Herpes Free
źródło
0

Ten fragment kodu awk pozwoli Ci pokazać nie tylko kilka pierwszych wierszy, ale także zakres, który możesz określić. Doda również numery wierszy, których potrzebowałem do debugowania komunikatu o błędzie wskazującego na pewną linię w dół w pliku gzip.

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

Oto fragment kodu awk użyty w jednej linijce powyżej. W awk NR jest zmienną wbudowaną (liczba dotychczas znalezionych rekordów), która zwykle jest odpowiednikiem numeru wiersza. zmienne od i do są pobierane z wiersza poleceń za pomocą opcji -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Wolfgang Fahl
źródło