Numbering Lines

Problem

You need to number the lines of a text file for reference or for use as an example.

Solution

Thanks to Michael Wang for contributing the following shell-only implementation and reminding us about cat -n. Note that our sample file named lines has a trailing blank line:

$ i=0; while IFS= read -r line; do (( i++ )); echo "$i $line"; done < lines
1 Line 1
2 Line 2
3
4 Line 4
5 Line 5
6

Or a useful use of cat:

$ cat -n lines
     1 Line 1
     2 Line 2
     3
     4 Line 4
     5 Line 5
     6

$ cat -b lines
     1 Line 1
     2 Line 2
     3 Line 4
     4 Line 5

Discussion

If you only need to display the line numbers on the screen, you can use less -N:

$ /usr/bin/less -N filename
      1 Line 1
      2 Line 2
      3
      4 Line 4
      5 Line 5
      6
lines (END)

Warning

Line numbers are broken in old versions of less on some obsolete Red Hat systems. Check your version with less -V. Version 358+iso254 (e.g., Red Hat 7.3 & 8.0) is known to be bad. Version 378+iso254 (e.g., RHEL3) and version 382 (RHEL4, Debian Sarge) are known to be good; we did not test other versions. The problem is subtle and may be related to an older iso256 patch. You can easily compare last line numbers as the vi and Perl examples are correct.

You can also use vi (or view, which is read-only vi) with the :set nu! command:

$ vi filename
      1 Line 1
      2 Line 2
      3
      4 Line 4
      5 Line 5
      6
~
:set nu!

vi has many options, so you can start vi by doing things like vi +3 -c 'set nu!' filename to turn on line numbering and place your cursor on line 3. If you’d like more control over how the numbers are displayed, you can also use nl, awk, or perl:

$ nl lines
     1 Line 1
     2 Line 2

     3 Line 4
     4 Line 5

$ nl -ba lines
     1 Line 1
     2 Line 2
     3
     4 Line 4
     5 Line 5
     6
$ awk '{ print NR, $0 }' filename
1 Line 1
2 Line 2
3
4 Line 4
5 Line 5
6

$ perl -ne 'print qq($.	$_);' filename
1 → Line 1
2 → Line 2
3 →
4 → Line 4
5 → Line 5
6 →

NR and $. are the line number in the current input file in awk and Perl respectively, so it’s easy to use them to print the line number. Note that we are using a → to denote a Tab character in the Perl output, while awk uses a space by default.

See Also

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.227.114.125