How do I delete the first n lines of an ascii file using shell commands?
As long as the file is not a symlink or hardlink, you can use sed, tail, or awk. Example below.
$ cat t.txt
12
34
56
78
90
sed
$ sed -e '1,3d' < t.txt
78
90
You can also use sed in-place without a temp file: sed -i -e 1,3d yourfile
. This won't echo anything, it will just modify the file in-place. If you don't need to pipe the result to another command, this is easier.
tail
$ tail -n +4 t.txt
78
90
awk
$ awk 'NR > 3 { print }' < t.txt
78
90
sed -i '1,3d' file.txt
This deletes first 3 line from file.txt.
If the tabulated lines are the ones that have a tab character:
grep '␉' <input_file >output_file
(␉
being a literal tab character) or equivalently
sed -n '/␉/p' <input_file >output_file
In a bash/ksh/zsh script, you can write $'\t'
for a tab, e.g. grep $'\t'
or sed -n $'/\t/p'
.
If you want to eliminate 10 lines at the beginning of the file:
tail -n +11 <input_file >output_file
(note that it's +11
to eliminate 10 lines, because +11
means “start from line 11” and tail numbers lines from 1) or
sed '1,10d' <input_file >output_file
On Linux, you can take advantage of GNU sed's -i
option to modify files in place:
sed -i -n '/\t/p' *.txt
Or you can use a shell loop and temporary files:
for x in *.txt; do
tail -n +11 <"$x" >"$x.tmp"
mv "$x.tmp" "$x"
done
Or if you don't want to modify the files in place, but instead give them a different name:
for x in *.txt; do
tail -n +11 <"$x" >"${x%.txt}.data"
done