How to Read Lines From Large Compressed File Without Decompressing in Linux Mint

In this post you can find how to read first or any lines from a large gzip archive. I have a 1.1 GB .gz file which becomes a 65 GB text file after decompression. So let's find how we can do it in Linux Mint terminal without executing the file and external libraries.

I would like to read the first 5 lines and lines between 1000 and 1100. Decompression takes time and storage which is not acceptable for my needs.

All solutions are using the Linux Mint terminal.

Step 1: Read First Lines From Large Compressed File in Terminal

To start let's read the first N lines from the large archive. For this purpose we are going to use command - zcat in combination with command - head. The file is available on this path - /data/Homo_sapiens.GRCh38.dna.toplevel.fa.gz

zcat Homo_sapiens.GRCh38.dna.toplevel.fa.gz | head -n 5

result:

>1 dna:chromosome chromosome:GRCh38:1:1:248956422:1 REF
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

The first command reads the gz file - no extraction is needed. Then we pipe the command head which is going to read 5 lines or any other number.

The first N lines are available instantly.

Step 2: Read Specific Lines From Large Compressed Text File

In this step we are going to read specific lines from the same file. Let's say that we need to read lines: 5, 7, 11, 16. This time we are going to use command zcat in combination with sed:

zcat Homo_sapiens.GRCh38.dna.toplevel.fa.gz | sed -n '5p;7p;11p;16p;17q'

Where the line numbers are given as 5p , 7p.

The parameter 17q at the end stops the reading after the last line. Otherwise you might crash your system for extremely large files. You need to provide a stop after the last page.

Note: If you run the command without 17q you can stop the execution by combination of CTRL + C

Step 3: Read Range of Lines From Large Gzip File in Linux Mint

At the end let's find how to get a range of lines from the same large gzip file. There are two ways of getting this information:

  • zcat + sed
  • zcat + head/tail

So let's assume that we need to read lines from 1100 up to 1105.

Read range of lines with zcat + head/tail

Reading the pages between 1100 and 1105 is possible by next command:

zcat /mnt/x/Data/HumanGenome/Homo_sapiens.GRCh38.dna.toplevel.fa.gz | tail -n +1100 | head -n 5

result. This can be interpret as starting from line 1100 - read next 5 lines:

TTCCCCAGGTCCGGTGTTTTCTTACCCACCTCCTTCCCTCCTTTTTATAATACCAGTGAA
ACTTGGTTTGGAGCATTTCTTTCACATAAAGGTACAAATCATACTGCTAGAGTTGTGAGG
ATTTTTACAGCTTTTGAAAGAATAAACTCATTTTAAAAACAGGAAAGCTAAGGCCCAGAG
ATTTTTAAATGATATTCCCATGATCACACTGTGAATTTGTGCCAGAACCCAAATGCCTAC
TCCCATCTCACTGAGACTTACTATAAGGACATAAGGCATTTATATATATATATATTATAT

Read range of lines with zcat + sed

Another way of doing the same thing is by piping zcat and sed commands. This time the sed command has different syntax:

zcat /mnt/x/Data/HumanGenome/Homo_sapiens.GRCh38.dna.toplevel.fa.gz | sed -n '1100,1105p;1106q'

result:

TTCCCCAGGTCCGGTGTTTTCTTACCCACCTCCTTCCCTCCTTTTTATAATACCAGTGAA
ACTTGGTTTGGAGCATTTCTTTCACATAAAGGTACAAATCATACTGCTAGAGTTGTGAGG
ATTTTTACAGCTTTTGAAAGAATAAACTCATTTTAAAAACAGGAAAGCTAAGGCCCAGAG
ATTTTTAAATGATATTCCCATGATCACACTGTGAATTTGTGCCAGAACCCAAATGCCTAC
TCCCATCTCACTGAGACTTACTATAAGGACATAAGGCATTTATATATATATATATTATAT
ATACTATATATTTATATATATTACATATTATATATATAATATATATTATATAATATATAT

Step 4: Read Range of Lines From Large Gzip and Preprocessing

Finally lets find how to do some preprocessing of the information if needed. In this case we are going to read only a part from the first line.

This will be done by using the command - awk:

zcat Homo_sapiens.GRCh38.dna.toplevel.fa.gz |  awk '{ print $2; exit }'

result:

dna:chromosome