Display file contents based on line number
Write a Perl program to display contents of the file in sorted order(ascending) based on line numbers given via command-line arguments. Note that the line numbers can be in any order and throw an error if the line number is large.
Syntax: perl
Filename.pl
File_to_be_read.abc
x y z
Here,
Filename.pl is the name of the file that contains the perl script
File_to_be_read.abc is the name of the file which is to be read. This file can be of any type. Ex- text, script, etc.
x y z are the line numbers which are to be printed.
Approach:
Sort the line numbers excluding the first argument which is file name. Once sorted read whole content of the file into an array using single statement (my @file = <FNAME>). Now loop through the sorted line numbers and display the file content by passing line number as index to file array like (print “$file[$var-1]\n”;).
Example 1: Consider a file Hello.txt
#!/usr/bin/perl use warnings; use strict; # Check if line numbers are given as an input if ( @ARGV < 2) { die "usage: pick file_name line_no1 line_no2 ..." ; } open FNAME, $ARGV [0] or die "cannot open file" ; # Exclude the first argument # for sorting line numbers shift ( @ARGV ); my @line_numbers = sort { $a <=> $b } @ARGV ; # Read whole file content into an array # and removes new line using chomp() chomp ( my @file = <FNAME>); foreach my $var ( @line_numbers ) { if ( $var > $#file ) { print "Line number $var is too large\n" ; next ; } print "$file[$var-1]\n" ; } close FNAME; |
Output:
Example 2: Reading the same script file
#!/usr/bin/perl use warnings; use strict; # Check if line numbers are given as an input if ( @ARGV < 2) { die "usage: pick file_name line_no1 line_no2 ..." ; } open FNAME, $ARGV [0] or die "cannot open file" ; # Exclude the first argument # for sorting line numbers shift ( @ARGV ); my @line_numbers = sort { $a <=> $b } @ARGV ; # Read whole file content into an array # and removes new line using chomp() chomp ( my @file = <FNAME>); foreach my $var ( @line_numbers ) { if ( $var > $#file ) { print "Line number $var is too large\n" ; next ; } print "$file[$var-1]\n" ; } close FNAME; |
Output:
If the line number passed is not in the file:
Recommended Posts:
- Perl | Use of Hash bang or Shebang line
- Perl | Line Action Commands in a Debugger
- Perl | Multi-line Strings | Here Document
- Perl | Appending to a File
- Perl | File I/O Functions
- Perl | File Upload in CGI
- Perl | File Locking
- Perl | Writing to a File
- Perl | Reading a CSV File
- Perl | Searching in a File using regex
- Perl | File Handling Introduction
- Perl | Opening and Reading a File
- Perl | File Test Operators
- Perl | Useful File-handling functions
- Perl | Accessing a Directory using File Globbing
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.