rone: (Default)
[personal profile] rone

I want to run a command that will give me the contents of a file, except for the last two lines.  I know that tail -2 filename will give me the last two lines of a file, and head -2 filename will give me the first two lines of a file.  Now, tail +2 filename will give me contents of a file, starting with line 2.  It's not a symmetrical option, but i can at least work with that.  However, the head command lacks this elegant mode; otherwise, i would infer that head +3 filename would give me what i want.  Is there a simple command that can do what i want?  I figure i can implement this in some fugly perl script, but that is not the damn point.

assuming you're using bash.

Date: 2008-12-05 08:08 am (UTC)
From: [identity profile] rwx.livejournal.com
head -$((`wc -l foo | cut -c-8` -2)) foo

Re: assuming you're using bash.

Date: 2008-12-05 08:10 am (UTC)
From: [identity profile] rwx.livejournal.com
also supposing you were speaking metaphorically when you said 'simple.'

Re: assuming you're using bash.

Date: 2008-12-05 08:14 am (UTC)
From: [identity profile] dagbrown.livejournal.com

But that makes two passes through the file and forks an unnecessary cut!

Here, still in two passes, but golfed a bit:

head -$((`wc -l < foo`-2)) foo

And what the hell, here's the fugly perl anyway. One pass, but Perl:


  my @queue;
  while(<>) {
    unshift @queue, $_;
    print pop @queue if scalar(@queue) > 2;
  }

Re: assuming you're using bash.

Date: 2008-12-05 06:37 pm (UTC)
From: [identity profile] drieuxster.livejournal.com
There are no Fuggly Perl Code!!!

Only Fuggly Whiners about solution spaces...

Date: 2008-12-05 08:24 am (UTC)
From: [identity profile] mundivagant.livejournal.com
head --lines=-N

(edit) in this case, head --lines=-2

(edit 2) output of head --version:
head (GNU coreutils) 6.10
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie and Jim Meyering.
Edited Date: 2008-12-05 08:26 am (UTC)

Date: 2008-12-05 07:11 pm (UTC)
ext_8707: Taken in front of Carnegie Hall (cigar)
From: [identity profile] ronebofh.livejournal.com
I declare you winner.

Date: 2008-12-05 07:18 pm (UTC)
From: [identity profile] mundivagant.livejournal.com
WE ARE ALL WINNERS!!11111

YAAAAAAAAAAY

GNU

Date: 2008-12-06 12:48 am (UTC)
From: [identity profile] he-who-wanders.livejournal.com

Anytime you can run code written by DJM I say uoi are the winner..

Date: 2008-12-05 08:25 am (UTC)
From: [identity profile] dagbrown.livejournal.com

Heh, I just thought of an evil one.

tac foo | tail +2 | tac

Date: 2008-12-05 08:27 am (UTC)
ext_8707: Taken in front of Carnegie Hall (bofh)
From: [identity profile] ronebofh.livejournal.com
Heh, a friend elsewhere suggested that one, too. Only a weenie OS like Linux would have a utility like tac.

Date: 2008-12-05 08:33 am (UTC)
From: [identity profile] dagbrown.livejournal.com
It actually had its genesis in a bunch of other weenies: the wacky land of BSD ("cat came back from Berkeley waving flags").

Date: 2008-12-05 07:11 pm (UTC)
ext_8707: Taken in front of Carnegie Hall (imminent destruction)
From: [identity profile] ronebofh.livejournal.com
Ironic that FreeBSD doesn't have it anymore...

Date: 2008-12-05 07:55 pm (UTC)
From: [identity profile] glaucon.livejournal.com
tac!
fucking awesome!

this is my new favorite unix command.
(replacing "yes")



Date: 2008-12-05 03:33 pm (UTC)
ext_243: (bee weapon)
From: [identity profile] xlerb.livejournal.com
I was going to suggest that, but with tail -r instead of tac (and the intimation that some systems may provide that functionality by a different means).

after a few rounds of optimization

Date: 2008-12-05 10:14 am (UTC)
From: [identity profile] oh6.livejournal.com
sed -n -e H -e '/\n/h' -e g -e '/\n.*\n/!b' -e P -e D

Date: 2008-12-05 11:35 am (UTC)
vatine: Generated with some CL code and a hand-designed blackletter font (Default)
From: [personal profile] vatine
There is always awk...

Date: 2008-12-05 02:37 pm (UTC)
ext_86356: (2632)
From: [identity profile] qwrrty.livejournal.com
You want fugly? I dare you to do it in bc.

Date: 2008-12-05 03:23 pm (UTC)
From: [identity profile] arian1.livejournal.com
I say you give the +2 filename to the ranger and keep the +3 filename for yourself. Sell off the -2 one and head back into the dungeon.

decaf...

Date: 2008-12-05 06:39 pm (UTC)
From: [identity profile] drieuxster.livejournal.com
switch toooo decalf.....

Date: 2008-12-05 05:37 pm (UTC)
From: [identity profile] sweh.livejournal.com
sed -e '$d' | sed -e '$d'

nasty but it works and is simple to understand.

sed -e 'N;$!P;$!D;$d'
actually does want you want (but has a bug if the file is only 1 line long).

(I googled that... took 5 seconds "sed all but last 2 lines". Don't think I could have created it on my own since I'm not too good with sed pattern buffer mangling)

Date: 2008-12-10 01:33 pm (UTC)
From: [identity profile] kerri9494.livejournal.com
The nurdiness of this thread has me all aflutter. I just had to say.

I was gonna say, "Count the lines, and then get count -2." I had no idea the poetry.

Profile

rone: (Default)
entombed in the shrine of zeroes and ones

December 2022

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 31

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 25th, 2025 01:18 am
Powered by Dreamwidth Studios