Tags: consecutive, file, guess, lines, linux, pipe, print, printing, programming, screen, script, text, ulimately, unix
printing a given set of consecutive lines from a text file
On Programmer » Unix & Linux
3,704 words with 7 Comments; publish: Sat, 17 Nov 2007 03:08:00 GMT; (20078.13, « »)
I guess it isn't a script question per se, but it could be used in a script. What I want to do is to print to the screen (and ulimately pipe to a file) a particular number of lines from a text file, starting at a given line. The "more" command starts from a specified line with the +num option but then it goes right to the end of the file. I have specified a page length but when you pipe to a file that doesn't make any difference. This might be confusing so I'll give a simple example.
Say file1.txt is:
line1
line2
line3
line4
line5
and I want file2.txt to be:
line3
line4
How can I do this? Would I have to write a script or is there a single line command I haven't thought of?
Thanks.
http://unix-linux.itags.org/q_unix-linux-programming_92630.html
All Comments
Leave a comment...
- 7 Comments

- Could you do soemthing like ( very basic might not be what you need )
cat file | tail -3 >tmp_file
cat tmp_file | head -2 > final_file
-goon12
#1; Sat, 17 Nov 2007 17:28:00 GMT

- I only know the number of lines from the beginning of the file, and the end of the file is being added to by another program (the example file is very much smaller than the files I am dealing with). I actually ended up doing it by hand, but I will take note of the "head" command, of which I was previously unaware, for future use. Thanks for the suggestion.#2; Sat, 17 Nov 2007 17:29:00 GMT

- I figured out exactly what I had to do, now that I know about the "head" command. The command is:
more +3 file1.txt |head -2
#3; Sat, 17 Nov 2007 17:30:00 GMT

- #!/bin/sh
# dumpln
# $1 = filename
# $2 = start
# $3 = end
let count=0
while read rec
do
count=`expr $count + 1`
if [ $count -ge $2 ] && [ $count -le $3 ];then
echo $rec
fi
done < $1
usage:
save the code in a file called dumpln
chmod +x dumpln
dumpln filename start line end line
example:
dumpln oldfile 4 10 > newfile
#4; Sat, 17 Nov 2007 17:31:00 GMT

- I thought I would do it in perl:
#!/usr/bin/perl
$| =1;
$file = shift;
$startNum = shift;
$endNum = shift;
open (FILE, $file) or die "could not open file:$!\n";
my $x='0';
while (<FILE>){
$x++;
if ($x >= $startNum && $x <= $endNum){print};
}
close FILE;
it takes the file you want to work on as an argument with the start and end lines you want.
#5; Sat, 17 Nov 2007 17:32:00 GMT

- Do the lines have any strings which are common, and are uncommon to the lines you would like to omit? If so, you can use the grep command to select those lines with the matching strings or you can use the -v option to invert the matches or select those lines without the matching strings. This will probably allow you to be more general in your line selecting techniques.
grep "matching string" filename > __filename
or
grep -v "matching string" filename > __filename
Earlier you were mentioning pipes, but I think you meant to say "redirect" the output into another file which is what the > operator does. So you have many suggestions this one would apply if your lines weren't always consecutive in nature and there is matching text in the lines you want to keep.
EVAC
#6; Sat, 17 Nov 2007 17:33:00 GMT

- tac and head ...
...unusual Q. from someone in my work..
How can I remove the first and last n lines of a file? "tail" can, but "head" can't.
Elegant answer, using tac - cat in reverse!
tail +3 foo|tac|tail +3|tac
Whoa! Don't ya just luuuurve them pipes!!!
Now if I knew how to do a <EDIT> I Do Now!! (I think)
for i in /home/andy/pr0n
do....
tail +3 $i | tac | tail +3 | tac > $i
done
construct... </EDIT>
Neatsville!
-Andy
#7; Sat, 17 Nov 2007 17:34:00 GMT