Displaying the first field if the second field matches the pattern using Perl


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Displaying the first field if the second field matches the pattern using Perl
# 1  
Old 11-04-2012
Displaying the first field if the second field matches the pattern using Perl

Hi,

I am trying with the below Perl command to print the first field when the second field matches the given pattern:
Code:
perl -lane 'open F, "< myfile"; for $i (<F>) {chomp $i; if ($F[1] =~ /patt$/) {my $f = (split(" ", $i))[0]; print "$f";}} close F' dummy_file

I know I can achieve the same with the following thread: https://www.unix.com/shell-programmin...s-pattern.html. But still I am curious why this code is not returning any expected result and how to correct it. Any help please.
# 2  
Old 11-04-2012
The code you've provided does what it's supposed to do.

First of all, you are opening the file myfile, reading it completely and then closing the associated filehandle, once for each line in the file dummy_file.

For every line from dummy_file in which the 2nd field $F[1] (split on white-space using the -a run-time switch) matches the pattern patt anchored at the end, the first element of the list slice (split(" ", $i))[0], obtained by splitting the line from myfile on white-space, is displayed.

What exactly are you trying to do? Please elaborate with input and output samples.

Last edited by elixir_sinari; 11-05-2012 at 12:21 AM..
# 3  
Old 11-05-2012
Quote:
Originally Posted by elixir_sinari
The code you've provided does what it's supposed to do.

First of all, you are opening the file myfile, reading it completely and then closing the associated filehandle, once for each line in the file dummy_file.

For every line from dummy_file in which the 2nd field $F[1] (split on white-space using the -a run-time switch) matches the pattern patt anchored at the end, the first element of the list slice (split(" ", $i))[0], obtained by splitting the line from myfile on white-space, is displayed.

What exactly are you trying to do? Please elaborate with input and output samples.
Thank you, but the dummy file is just an empty file to fulfill or complete the syntax (else Perl reads from stdin). The actual file in action is "myfile" where I am looping over its contents by reading from the file handle 'F'. The white space splitting is done on the myfile's contents and not of the dummy file.

Lets say, my input is, myfile's contents:

aa bb cc
1a 2a 3a

I would like to get the output as:
aa

where 'bb' is the pattern to be matched.
# 4  
Old 11-05-2012
Code:
perl -lane '$F[1] =~ /bb$/ && print $F[0]' myfile

OR
Code:
 awk '$2 ~ /bb$/ {print $1}' myfile

# 5  
Old 11-05-2012
That's as simple as:
Code:
perl -lane 'print $F[0] if $F[1] =~ /bb$/' myfile

You don't need any dummy file.
# 6  
Old 11-06-2012
Thank you balajesuri and elixir_sinari for the simplified code Smilie

Ok, now I got the idea and I have revised my code as below:
Code:
perl -lane 'open F, "< f1"; for $i (<F>) {chomp $i; if ($i =~ /$F[1]$/) {my $f = (split(" ", $i))[0]; print "$f";}} close F' f2

I am printing here the 1st field of file f1 if any of its line contains file f2's second column's string as a pattern to be matched at the end of the line

The input contents are:
Code:
$ cat f1
aa b c patt
11 2 3 4

$ cat f2
This patt
1234 xxxx

Now, it's working like a charm and I am getting the expected result Smilie

Last edited by royalibrahim; 11-06-2012 at 03:38 AM..
# 7  
Old 11-06-2012
Quote:
Originally Posted by royalibrahim
I Just want to understand whether in Perl, is it possible to iterate over a file object using a for loop as I did in my code? Perl complains no error even if you use it.
Of course, yes. You did it, right?

Why would perl complain when what you were doing was syntactically correct but logically wrong?

Never use a for (or foreach) loop to read a file. In this case, all lines from the file (depending on the input record separator) will be read in at once and stored in memory to form a list. Your loop will then iterate over the elements of this list. So, you might hit your system's memory limits.

A while loop is much much better as it reads one record at a time.
This User Gave Thanks to elixir_sinari For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Need to replace last field in a file,if first field matches

Hi, Need to replace last field in a file(/etc/passwd) ,if first filed matches with particular username. Scenario: cat testfor1 deekshi:x:7082:7082::/home/deekshi:/bin/bash harini1:x:7083:7083::/home/harini1:/bin/bash Here,if first field contains "deekshi", then i should replace... (4 Replies)
Discussion started by: Sumanthsv
4 Replies

2. UNIX for Dummies Questions & Answers

Displaying field of NR, not the line #

Within AWK, how do you display a field of NR? Here's my code: awk '(NR>1) && (P1=$1-w)>=100000 {print "increase of" " " P1*.0000179," " "kW at" " " 'NR*60/431900' " " "minutes" "\n" "change from" " " 'NR-10($1)' " " "kW to" " " 'NR+70($1)' "\n"}{w=$1}' filename I can change NR and print... (3 Replies)
Discussion started by: markymarkg123
3 Replies

3. UNIX for Dummies Questions & Answers

Match pattern in a field, print pattern only instead of the entire field

Hi ! I have a tab-delimited file, file.tab: Column1 Column2 Column3 aaaaaaaaaa bbtomatoesbbbbbb cccccccccc ddddddddd eeeeappleseeeeeeeee ffffffffffffff ggggggggg hhhhhhtomatoeshhh iiiiiiiiiiiiiiii ... (18 Replies)
Discussion started by: lucasvs
18 Replies

4. Shell Programming and Scripting

Displaying a field completely

Version: AIX 6.1 (korn shell) In the below output, the field with the heading 'Address' has some names like hwproc214-priv1.gnas.wrd.netwhich are only partially displayed. $ netstat -i Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll en2 1500 link#2 ... (3 Replies)
Discussion started by: polavan
3 Replies

5. Shell Programming and Scripting

AWK: Pattern match between 2 files, then compare a field in file1 as > or < field in file2

First, thanks for the help in previous posts... couldn't have gotten where I am now without it! So here is what I have, I use AWK to match $1 and $2 as 1 string in file1 to $1 and $2 as 1 string in file2. Now I'm wondering if I can extend this AWK command to incorporate the following: If $1... (4 Replies)
Discussion started by: right_coaster
4 Replies

6. Shell Programming and Scripting

awk to sum specific field when pattern matches

Trying to sum field #6 when field #2 matches string as follows: Input data: 2010-09-18-20.24.44.206117 UOWEXEC db2bp DB2XYZ hostname 1 2010-09-18-20.24.44.206117 UOWWAIT db2bp DB2XYZ hostname ... (3 Replies)
Discussion started by: ux4me
3 Replies

7. Shell Programming and Scripting

How to print line if field matches?

Hi all, I got several lines line this a b c d e 1 e a 1 c d e 3 f a b c 1 e 8 h a b c d e 1 w a 1 c d e 2 w a b c d e 1 t a b c d e 7 4 How can I print the line if 1 is the field one before the last field? Basicly this 2 field ? a b c d e 1 e a b c d e 1 t The file I got is... (7 Replies)
Discussion started by: stinkefisch
7 Replies

8. Shell Programming and Scripting

adding field values if field matches

hi i have file as below , i want to add duplicate records like bell_bb to one record with valuve as 15 ( addition of both ) any oneline awk script to achive this ? header 0 CAMPAIGN_NAME 1 Bell_BB 14 Bell_MONTHLY 803 SOLO_UNBEATABLE 644 Bell_BB 1 Bell_MONTHLY 25 SOLO_UNBEATABLE... (4 Replies)
Discussion started by: raghavendra.cse
4 Replies

9. Shell Programming and Scripting

Displaying lines of a file where the second field matches a pattern

Howdy. I know this is most likely possible using sed or awk or grep, most likely a combination of them together, but how would one go about running a grep like command on a file where you only try to match your pattern to the second field in a line, space delimited? Example: You are... (3 Replies)
Discussion started by: LordJezoX
3 Replies

10. Shell Programming and Scripting

Print line if first Field matches a pattern

Hi All, I would like my code to be able to print out the whole line if 1st field has a dot in the number. Sample input and expected output given below. My AWK code is below but it can;t work, can any expert help me ? Thanks in advance. {if ($1 ~ /*\.*/) { print $0 }} Input: ... (2 Replies)
Discussion started by: Raynon
2 Replies
Login or Register to Ask a Question