Print a file, skipping the first X lines, in Bash

LinuxBashPrintingSkip

Linux Problem Overview


I have a very long file which I want to print, skipping the first 1,000,000 lines, for example.

I looked into the cat man page, but I did not see any option to do this. I am looking for a command to do this or a simple Bash program.

Linux Solutions


Solution 1 - Linux

You'll need tail. Some examples:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

If you really need to SKIP a particular number of "first" lines, use

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

That is, if you want to skip N lines, you start printing line N+1. Example:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

If you want to just see the last so many lines, omit the "+":

$ tail -n <N> <filename>
< last N lines of file. >

Solution 2 - Linux

Easiest way I found to remove the first ten lines of a file:

$ sed 1,10d file.txt

In the general case where X is the number of initial lines to delete, credit to commenters and editors for this:

$ sed 1,Xd file.txt

Solution 3 - Linux

If you have GNU tail available on your system, you can do the following:

tail -n +1000001 huge-file.log

It's the + character that does what you want. To quote from the man page:

> If the first character of K (the number of bytes or lines) is a > `+', print beginning with the Kth item from the start of each file.

Thus, as noted in the comment, putting +1000001 starts printing with the first item after the first 1,000,000 lines.

Solution 4 - Linux

If you want to skip first two line:

tail -n +3 <filename>

If you want to skip first x line:

tail -n +$((x+1)) <filename>

Solution 5 - Linux

A less verbose version with AWK:

awk 'NR > 1e6' myfile.txt

But I would recommend using integer numbers.

Solution 6 - Linux

Use the sed delete command with a range address. For example:

sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Alternatively, if you want to only print a known range, use the print command with the -n flag:

sed -n 201,300p file.txt # Print lines 201-300 from file.txt

This solution should work reliably on all Unix systems, regardless of the presence of GNU utilities.

Solution 7 - Linux

Use:

sed -n '1d;p'

This command will delete the first line and print the rest.

Solution 8 - Linux

If you want to see the first 10 lines you can use sed as below:

sed -n '1,10 p' myFile.txt

Or if you want to see lines from 20 to 30 you can use:

sed -n '20,30 p' myFile.txt

Solution 9 - Linux

Just to propose a sed alternative. :) To skip first one million lines, try |sed '1,1000000d'.

Example:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005

Solution 10 - Linux

You can do this using the head and tail commands:

head -n <num> | tail -n <lines to print>

where num is 1e6 + the number of lines you want to print.

Solution 11 - Linux

This shell script works fine for me:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
 	if (NR >= initial_line && NR <= end_line) 
 	print $0
}' $3

Used with this sample file (file.txt):

one
two
three
four
five
six

The command (it will extract from second to fourth line in the file):

edu@debian5:~$./script.sh 2 4 file.txt

Output of this command:

two
three
four

Of course, you can improve it, for example by testing that all argument values are the expected :-)

Solution 12 - Linux

cat < File > | awk '{if(NR > 6) print $0}'

Solution 13 - Linux

I needed to do the same and found this thread.

I tried "tail -n +, but it just printed everything.

The more +lines worked nicely on the prompt, but it turned out it behaved totally different when run in headless mode (cronjob).

I finally wrote this myself:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEduardoView Question on Stackoverflow
Solution 1 - LinuxSingleNegationEliminationView Answer on Stackoverflow
Solution 2 - LinuxDavid ParksView Answer on Stackoverflow
Solution 3 - LinuxEddieView Answer on Stackoverflow
Solution 4 - LinuxsaipraneethView Answer on Stackoverflow
Solution 5 - LinuxnewtoverView Answer on Stackoverflow
Solution 6 - LinuxmaericsView Answer on Stackoverflow
Solution 7 - LinuxSoroush PouryazdianView Answer on Stackoverflow
Solution 8 - LinuxKadir YILDIZView Answer on Stackoverflow
Solution 9 - LinuxtuomassaloView Answer on Stackoverflow
Solution 10 - LinuxDana the SaneView Answer on Stackoverflow
Solution 11 - LinuxsourcerebelsView Answer on Stackoverflow
Solution 12 - LinuxaamadeoView Answer on Stackoverflow
Solution 13 - LinuxfraterView Answer on Stackoverflow