GNU bug report logs - #24532
GNU wc --lines doesn't report last line when that doesn't end on a new-line.

Previous Next

Package: coreutils;

Reported by: Carlo Wood <carlo <at> alinoe.com>

Date: Sun, 25 Sep 2016 00:12:03 UTC

Severity: normal

Done: Paul Eggert <eggert <at> cs.ucla.edu>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#24532: closed (GNU wc --lines doesn't report last line when
 that doesn't end on a new-line.)
Date: Sun, 25 Sep 2016 02:01:01 +0000
[Message part 1 (text/plain, inline)]
Your message dated Sat, 24 Sep 2016 19:00:12 -0700
with message-id <008e722b-ef57-7dcd-4895-64c38849269b <at> cs.ucla.edu>
and subject line Re: bug#24532: GNU wc --lines doesn't report last line when that doesn't end on a new-line.
has caused the debbugs.gnu.org bug report #24532,
regarding GNU wc --lines doesn't report last line when that doesn't end on a new-line.
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
24532: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=24532
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Carlo Wood <carlo <at> alinoe.com>
To: bug-coreutils <at> gnu.org
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 <carlo <at> alinoe.com>


[Message part 3 (message/rfc822, inline)]
From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Carlo Wood <carlo <at> alinoe.com>, 24532-done <at> debbugs.gnu.org
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
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.


This bug report was last modified 8 years and 237 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.