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.
013 Answers
Use tail. Some examples:
$ tail file.log < Last 10 lines of file.log > To SKIP the first N lines:
$ tail -n +<N+1> <filename> < filename, excluding first N lines. > For instance, to skip the first 10 lines:
$ tail -n +11 file.log < file.log, starting at line 11, after skipping the first 10 lines. > To see the last N lines, omit the "+":
$ tail -n <N> <filename> < last N lines of file. > 8Easiest 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 3If 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.
3If you want to skip first two line:
tail -n +3 <filename> If you want to skip first x line:
tail -n +$((x+1)) <filename> 1A less verbose version with AWK:
awk 'NR > 1e6' myfile.txt But I would recommend using integer numbers.
2Use 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.
2Use:
sed -n '1d;p' This command will delete the first line and print the rest.
3If 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 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.
2Just 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 2This 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 :-)
1cat < File > | awk '{if(NR > 6) print $0}' 4I 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}" 4