Perl command line option '-n','-p' and multiple files: can it know a file name of a printed line?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl command line option '-n','-p' and multiple files: can it know a file name of a printed line?
# 1  
Old 05-30-2017
Perl command line option '-n','-p' and multiple files: can it know a file name of a printed line?

I am looking for help in processing of those options: '-n' or '-p'
I understand what they do and how to use them.
But, I would like to use them with more than one file (and without any shell-loop; loading the 'perl' once.)
I did try it and -n works on 2 files.
Question is:
- is it possible to distinguish from which file is a printed line?

So, I use command like:
Code:
perl -ne 'print " $.: $_" if /"\d\d"/' ./fl1 ./fl2

It have correctly selected lines, but I would like anyhow to get a file name where from each line is selected.
Not sure how to get it, if that is possible at all in such usage...

I understand the perl is using the
Code:
while (<>) {...}

I am not sure what is going to be read by the '<>'
- does it already concatenated the input files in shell before starting the Perl?
- Or Perl do it inside somehow?
Maybe it opening each file as standard-input, redirecting the stdin to a current file?!
If so, is it possible to get its name?

Will appreciate help, if you get some idea about how it works with more than one file!
(I understand, I could write everything without the '-n' or '-p', but would like to have that shortage be used,... if possible)
Thanks.

Last edited by rbatte1; 05-31-2017 at 07:45 AM..
# 2  
Old 05-30-2017
Code:
perl -ne '$.=1 if $ARGV ne $previous; print "$. in $ARGV: $_" if /\d\d/; $previous=$ARGV' fl[0-9] fl1{0..9}

Code:
while (<>) {...}

Read from file(s) given at the command line or from stdin if no file is given.

Last edited by Aia; 05-30-2017 at 07:19 PM..
These 2 Users Gave Thanks to Aia For This Post:
# 3  
Old 05-31-2017
Thank you, Aia!

So, the '<>' getting files in 'shift' from @ARGV

Only one think I didn't get (acctualy unrelated to question, but) : what is the fl[0-9]?
Quote:
Originally Posted by Aia
Code:
perl -ne '$.=1 if $ARGV ne $previous; print "$. in $ARGV: $_" if /\d\d/; $previous=$ARGV' fl[0-9] fl1{0..9}

Whas it assumed the same as next: fl{0..9} ?
So, it would generate list of files: fl1 fl2 .. fl19
# 4  
Old 05-31-2017
Quote:
Originally Posted by alex_5161
Thank you, Aia!

So, the '<>' getting files in 'shift' from @ARGV

Only one think I didn't get (acctualy unrelated to question, but) : what is the fl[0-9]?
Whas it assumed the same as next: fl{0..9} ?
So, it would generate list of files: fl1 fl2 .. fl19
They are a couple examples of ways you could call multiple files (even more than just two) at the command line, courtesy of the shell, without writing one by one.

fl[0-9] would expand to fl0 fl1 fl2 ... fl9 if they exist.
fl1{0..9} would expand to fl10 fl11 fl12 fl13 ... fl19, and expects them to exist.

Last edited by Aia; 05-31-2017 at 02:52 PM..
This User Gave Thanks to Aia For This Post:
# 5  
Old 05-31-2017
Yes, but:
fl[0-9] (called "Pathname Expansion / Pattern Matching") expands to EXISTING files that match the pattern, fl{0..9} (called "Brace Expansion") yields all strings unconditionally:
Code:
echo file[0-9]
file1 file2 file3 file4
echo file{0..9}
file0 file1 file2 file3 file4 file5 file6 file7 file8 file9

Guess which of those exist in my PWD? Both methods do have their applications.
This User Gave Thanks to RudiC For This Post:
# 6  
Old 05-31-2017
I see, thanks Aia, RudiC!
I know the {, ..}, but not the [....]: so, depends on file's existence!

Thanks! Appreciate your help! (And this forum!!)
# 7  
Old 06-01-2017
Also check the eof and eof() functions in the Perl documentation.
The eof function can be used to reset the line number in case multiple files are fed to the perl interpreter.

Code:
 $
$ cat -n file1.dat
     1  Data in line 1 of file file_1.dat
     2  Data in line 2 of file file_1.dat
     3  Data in line 3 of file file_1.dat
     4  Data in line 4 of file file_1.dat
     5  Data in line 5 of file file_1.dat
$
$ cat -n file2.dat
     1  Data in line 1 of file file_2.dat
     2  Data in line 2 of file file_2.dat
     3  Data in line 3 of file file_2.dat
     4  Data in line 4 of file file_2.dat
     5  Data in line 5 of file file_2.dat
$
$ cat -n file3.dat
     1  Data in line 1 of file file_3.dat
     2  Data in line 2 of file file_3.dat
     3  Data in line 3 of file file_3.dat
     4  Data in line 4 of file file_3.dat
     5  Data in line 5 of file file_3.dat
$
$ # $. is not reset by itself. Perl numbers the pseudo-file formed from the files listed on the command line
$ perl -lne 'printf("File = %s, Line = %2d : [%s]\n", $ARGV, $., $_)' file1.dat file2.dat file3.dat
File = file1.dat, Line =  1 : [Data in line 1 of file file_1.dat]
File = file1.dat, Line =  2 : [Data in line 2 of file file_1.dat]
File = file1.dat, Line =  3 : [Data in line 3 of file file_1.dat]
File = file1.dat, Line =  4 : [Data in line 4 of file file_1.dat]
File = file1.dat, Line =  5 : [Data in line 5 of file file_1.dat]
File = file2.dat, Line =  6 : [Data in line 1 of file file_2.dat]
File = file2.dat, Line =  7 : [Data in line 2 of file file_2.dat]
File = file2.dat, Line =  8 : [Data in line 3 of file file_2.dat]
File = file2.dat, Line =  9 : [Data in line 4 of file file_2.dat]
File = file2.dat, Line = 10 : [Data in line 5 of file file_2.dat]
File = file3.dat, Line = 11 : [Data in line 1 of file file_3.dat]
File = file3.dat, Line = 12 : [Data in line 2 of file file_3.dat]
File = file3.dat, Line = 13 : [Data in line 3 of file file_3.dat]
File = file3.dat, Line = 14 : [Data in line 4 of file file_3.dat]
File = file3.dat, Line = 15 : [Data in line 5 of file file_3.dat]
$
$ # $. is reset for each file; similar to awk's FNR == NR idiom
$ perl -lne 'printf("File = %s, Line = %2d : [%s]\n", $ARGV, $., $_); close(ARGV) if eof' file1.dat file2.dat file3.dat
File = file1.dat, Line =  1 : [Data in line 1 of file file_1.dat]
File = file1.dat, Line =  2 : [Data in line 2 of file file_1.dat]
File = file1.dat, Line =  3 : [Data in line 3 of file file_1.dat]
File = file1.dat, Line =  4 : [Data in line 4 of file file_1.dat]
File = file1.dat, Line =  5 : [Data in line 5 of file file_1.dat]
File = file2.dat, Line =  1 : [Data in line 1 of file file_2.dat]
File = file2.dat, Line =  2 : [Data in line 2 of file file_2.dat]
File = file2.dat, Line =  3 : [Data in line 3 of file file_2.dat]
File = file2.dat, Line =  4 : [Data in line 4 of file file_2.dat]
File = file2.dat, Line =  5 : [Data in line 5 of file file_2.dat]
File = file3.dat, Line =  1 : [Data in line 1 of file file_3.dat]
File = file3.dat, Line =  2 : [Data in line 2 of file file_3.dat]
File = file3.dat, Line =  3 : [Data in line 3 of file file_3.dat]
File = file3.dat, Line =  4 : [Data in line 4 of file file_3.dat]
File = file3.dat, Line =  5 : [Data in line 5 of file file_3.dat]
$
$

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

How to get " printed on command line?

Hey, Is there a way I can print " in a command line? When I type "echo "set variable = disco"".... This actually prints echo set variable = disco but I would like to print it out as --- echo "set variable = disco" Thanks, Satya (4 Replies)
Discussion started by: Indra2011
4 Replies

2. Shell Programming and Scripting

Perl : accept multiple user entered command line arguemnts

I am trying to create a script that will accept multi input from the user (really just me), then execute those command on a remote device. My question is if the I enter "No" at the confirmation point "Are these statements correct y or n ?", what is the best way to go back and start over ? I... (3 Replies)
Discussion started by: popeye
3 Replies

3. Shell Programming and Scripting

Perl how to compare two pdf files line by line

Hi Experts, Would really appreciate if anyone can guide me how to compare two pdf files line by line and report the difference to another file. (3 Replies)
Discussion started by: prasanth_babu
3 Replies

4. Shell Programming and Scripting

sed command to grep multiple pattern present in single line and delete that line

here is what i want to achieve.. i have a file with below contents cat fileName blah blah blah . .DROP this REJECT that . --sport 7800 -j REJECT --reject-with icmp-port-unreachable --dport 7800 -j REJECT --reject-with icmp-port-unreachable . . . more blah blah blah --dport 3306... (14 Replies)
Discussion started by: vivek d r
14 Replies

5. Shell Programming and Scripting

FAQ how to download multiple specific files via command line

Hi, This evening i would like to download multiple pcap captures files in the wireshark wiki sites. My aim is to download the capture files .pcap .cap and etc on the wireshark site SampleCaptures - The Wireshark Wiki. i already used wget, lynx, htget but still their problem downloading..it seems... (1 Reply)
Discussion started by: jao_madn
1 Replies

6. Homework & Coursework Questions

trouble understanding file option and command line arguments

Hi, I am creating a program with the C language that simulates the WC command in Unix. My program needs to count lines, bytes and words. I have not added the code to count bytes and words yet. I am having trouble understanding what the file option/flag '-' does. I can not visualize how it moves... (1 Reply)
Discussion started by: heywoodfloyd
1 Replies

7. Shell Programming and Scripting

perl script command line option driven script

could someone show me a sample command line option driven script? i want to see an easy way to write one and how i can execute it using command line options such as typing in read.pl -i <id> -c <cmds> -s <start> -e <end> would read out all the commands run by ID . from start time to... (7 Replies)
Discussion started by: kpddong
7 Replies

8. Shell Programming and Scripting

Perl, searching multiple files and printing returned line to new file

I am trying to find a way to utilise the full potential of my cpu cores and memory on my windows machine. Now, I am quite familiar with grep, however, running a Unix based OS is not an option right now. Unfortunately, the 32 bit grep for windows that I am running, I cannot run multiple... (1 Reply)
Discussion started by: Moloch
1 Replies

9. Shell Programming and Scripting

Need the line to be printed in single line

Hi, I have my code like this v_site_eli=`sqlplus -s<<-EOsqlplus $SQL_USERNAME/$SQL_PASSWD WHENEVER SQLERROR EXIT SQL.SQLCODE WHENEVER OSERROR EXIT FAILURE SET TERM OFF SET HEAD OFF SET VERIFY OFF SET FEEDBACK OFF declare VARIABLE vn_return_sts varchaR2(6); begin SELECT... (1 Reply)
Discussion started by: mjkreddy
1 Replies

10. OS X (Apple)

Command line tool to join multiple .wmv files?

I need a simple command line executable that allows me to join many wmv files into one output wmv file, preferrably in a simple way like this: wmvjoin file1.wmv file2.wmv .... > outputfile.wmv So what I want is the wmv-equivalent of mpgtx I cannot find it on internet. Thanks. (2 Replies)
Discussion started by: karman
2 Replies
Login or Register to Ask a Question

Featured Tech Videos