--- Begin Message ---
Subject: |
GNU wc --lines doesn't report last line when that doesn't end on a new-line. |
Date: |
Sun, 25 Sep 2016 02:08:12 +0200 |
You can argue that this is a feature, but I consider it a bug for all
practical purposes. A text file might be REQUIRED to end on a EOL
sequence (ie, '\n' for linux), in which case wc --lines works, but
consider for a moment a (otherwise) text file where the last line
does not end on a new-line:
echo "Line 1" > testfile
echo "Line 2" >> testfile
echo -n "Line 3" >> testfile
Now try to print the last two lines as follows:
$ tail -n 2 testfile
Line 2
Line 3<no new-line>
Hence, tail considers it to be a line.
Now suppose we want to print line 2 and all lines that follow,
then a reasonable attempt would be (using bash scripting):
total_lines=$(cat testfile | wc --lines)
remaining_lines=$((total_lines - 1))
tail -n $remaining_lines testfile
Right?
Counter intuitive that results in:
Line 3<no new-line>
... Line 2 wasn't printed!
Finally, sed is known to report the number of lines
as follows:
$ sed -n '$=' testfile
3
Hence, I consider it a bug that:
$ wc --lines testfile
2 testfile
Regards,
--
Carlo Wood <address@hidden>
--- End Message ---
--- Begin Message ---
Subject: |
Re: bug#24532: GNU wc --lines doesn't report last line when that doesn't end on a new-line. |
Date: |
Sat, 24 Sep 2016 19:00:12 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 |
Carlo Wood wrote:
You can argue that this is a feature, but I consider it a bug for all
practical purposes.
POSIX requires that wc -l must just count newlines, so it is indeed a feature.
If wc -l also counted incomplete lines at the end of a file, this would result
in counterintuitive behavior of a different sort. For example:
cat a b >c
wc -l a
wc -l b
wc -l c
Currently the first two numbers must sum to the third, but that would not be
true under the change you're proposing.
Incomplete lines must cause a problem of some sort, and I'm afraid that the
longstanding tradition is to cause the problem you ran into.
--- End Message ---