perl equivalent to grep -c


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting perl equivalent to grep -c
# 1  
Old 04-16-2008
perl equivalent to grep -c

Guess the subject lines says it all.

What is the perl equivalent to grep -c

-c, --count
Suppress normal output; instead print a count of match-
ing lines for each input file. With the -v, --invert-
match option (see below), count non-matching lines.

So if the file name is somefile, my search pattern is houseboat and there are 3 occurences/instances of houseboat in the file, I want to

$var=houseboat
$x=`grep -c $var somefile`
print '$var $x\n"

output

houseboat 3

Thanks
# 2  
Old 04-16-2008
Code:
perl -lne '$count++ if m/$ARGV[0]/o; END { print $ARGV[0], $count }'

See also perlfaq4 - perldoc.perl.org
# 3  
Old 04-17-2008
Still not seeing it

Humm Still dont know why I dont see this ..

Source file
----------
car
boat
house


Result file
---------
house
camper
car
motorcycle
car
skateboard
car
airplane
boat
house
boat
blimp
house
train

Result of script
---------------
house 3
car 3
boat 2


So ..

open (FILE1, "SOURCEFILE.TXT") or die; #open the source file
open (FILE2, "RESULTFILE.TXT") or die; #open the results file
#
@RESULTARRAY = <FILE2>; #put result file content in an
#array
#foreach $lineinthesourcefile (<FILE1>) { #Step through the source file.
#/$linethesourcefile/g) {
# $count++; # count the number of lineinthesourcefile in
@RESULTARRARY, then print line and count.
}
# 4  
Old 04-18-2008
Code:
open(FILE1,"<file");
open(FILE2,"<file1");
@file1 = <FILE1>;
%hashes=();
foreach my $i (@file1) {
 chomp($i) ;
 $hashes{$i}=0
}
while ( <FILE2> ) {
 chomp($_);  
 $hashes{$_}++;
} 
while ( ($key, $value) = each %hashes) {
    print "$key = $value\n";
}

# 5  
Old 04-18-2008
You don't really need the array for @file1 then, you can just run another while loop over that and save the memory for the array which only got used during initialization of the hash.

You also don't need to chomp the values, as long as you are consistent on whether or not you chomp.

This assumes you actually want to simulate "grep -x" (match whole lines), not find a token anywhere on a line in file2. If that's what you actually want, maybe something like this would work.

Code:
open (FILE1, "SOURCEFILE.TXT") or die "$0: Could not open SOURCEFILE.TXT: $!\n";
open (FILE2, "RESULTFILE.TXT") or die "$0: Could not open RESULTFILE.TXT: $!\n";

@RESULTARRAY = <FILE2>;
foreach $lineinthesourcefile (<FILE1>) {
  chomp $lineinthesourcefile;  # trim trailing newline
  @matches = grep { /$lineinthesourcefile/ } @RESULTARRAY;
  print $lineinthesourcefile, " ", scalar @matches, "\n" if @matches;
}

The "grep" finds the elements in @RESULTARRAY matching the condition in { } and returns those as a list. If that list has any elements, we print a report. (scalar @matches returns how many elements @matches has.)

This matches regardless of context, so "car" will be matched inside another word, like "scars" or "career". You can dress up the regular expression in the grep some if you want different behavior.

I was tempted to use @INSANELYLONGUPPERCASEVARIABLENAME instead of @matches, but if that's what you want, that's obviously easy to fix. <ducks>
# 6  
Old 04-18-2008
Ok fellas .. first thanks for the help ... it all definitely moved me in the right direction

The question : How many times do the lines shown in Source file show up in the Result file

Source file
-----------
car
boat
house
girl
hate

Result file
----------
car
boy
girl
dog
car
love
hate
boat
boat
hate
boat
boat
boy
girl
dog

Script results :
---------------

1 lines in the result file contain: car
4 lines in the result file contain: boat
0 lines in the result file contain: house
2 lines in the result file contain: girl
2 lines in the result file contain: hate

Code - one thing I need to look at ... the break out is brutal Smilie

open (FILE1, "cv1.TXT") or die "$0: Could not open SOURCEFILE.TXT: $!\n";
open (FILE2, "cv2.TXT") or die "$0: Could not open RESULTFILE.TXT: $!\n";

chomp(my @strings = <FILE2>);
while (1) {
foreach $pattern (<FILE1>) {
chomp($pattern);
#last if $pattern =~ /^\s*$/;
my @matches = eval {
grep /$pattern/, @strings;
};
if ($@) {
print "Error: $@";
} else {
my $count = @matches;
print "$count lines in the result file contain: $pattern \n"
}
}
exit;
}
# 7  
Old 04-19-2008
If you want to know which lines in one file exist in the other, doesn't ghostdog74's solution work for you? If you want to know how many lines in file 2 contain one of the words (anywhere on a line) in file 1, the script I posted ought to work. So please clarify: which one is it?

This distinction may seem academic, but has implications for whether to look for equality (line equals string) or pattern matching (line contains pattern) and, to a lesser extent, whether or not the final newline on every line is significant. If your real-world application handles lots of data, it may also matter that equality is faster than pattern matching.

When posting code, it's much more legible if you wrap it in [CODE] tags.

Your use of eval seems somewhat weird, you usually don't need to trap bare Perl code within eval, it's more useful when invoking a system call or otherwise interacting with the outside world. Also what's the endless loop for?

Last edited by era; 04-19-2008 at 03:53 AM.. Reason: Clarify wording; speed issue; point out [code] tags
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. AIX

Need grep -v Equivalent for AIX

Need grep -v "Hello" equivalent for AIX (9 Replies)
Discussion started by: mohtashims
9 Replies

2. Shell Programming and Scripting

Perl : Perl equivalent to the ksh | and ;

Ive been trying to move to Perl. It has been a struggle. My question is, is there a good resource that explains nesting statements. As an example. To change primary Factory CTS 1.9.0(46) P1 *Slot 1 CTS 1.10.2(42) P1 To primary *Slot 1 CTS 1.10.2(42) P1 ... (5 Replies)
Discussion started by: popeye
5 Replies

3. Shell Programming and Scripting

sed Equivalent for awk/grep

Any equivalent command using awk or grep? sed -n "/^$(date --date='10 minutes ago' '+%b %_d %H:%M')/,\$p" /abc.log (7 Replies)
Discussion started by: timmywong
7 Replies

4. Shell Programming and Scripting

Perl equivalent substitution

hi Geeks, my input file contains data like => 53 - Deewana Kar Raha Hai.mp3 54 - Hale Dil.mp3 55 - Ishq Sufiyana.mp3 56 - Abhi Kuch Dino Se.mp3 57 - Pee Loon Hoto Ki Sargam.mp3 I had used sed command to remove the prefix from the file name like sed 's/^\ it gives me the perfect... (4 Replies)
Discussion started by: lohith.dutta
4 Replies

5. Shell Programming and Scripting

What is the equivalent of NR (awk) in perl?

Hello, I searched online; it seems that perl use $NR as NR in awk; however it does not work for me. For example, how to re-write the following awk using perl: awk '{ print NR}' inputfile---------- Post updated at 01:55 PM ---------- Previous update was at 12:49 PM ---------- I found... (2 Replies)
Discussion started by: littlewenwen
2 Replies

6. Shell Programming and Scripting

GAWK/GREP Equivalent

What is GAWK equivalent to greps -B 5 -A 5? zgrep -i "^oct 20" /var/log/syslog*|grep -iB 5 -A 5 'postfix\/pickup /var/log/syslog.1.gz:Oct 20 01:55:01 elmo CROND: (mail) CMD (/usr/bin/python -S /usr/lib64/mailman/cron/gate_news) /var/log/syslog.1.gz:Oct 20 02:00:01 elmo CROND: (mail) CMD... (5 Replies)
Discussion started by: metallica1973
5 Replies

7. Shell Programming and Scripting

grep -v equivalent in perl

I have to do grep -v in a perl script. I want to exclude blank lines and lines having visitor. #grep -v visitor abc.txt |grep '.' file:abc.txt 1340 not booked 16D:D9 tourist 8 1341 not booked 16C:D4 tourist 25 1342 not booked 16D:C4 visitor 7 1343 not booked 01C:D9 visitor 6 1344... (4 Replies)
Discussion started by: dynamax
4 Replies

8. Shell Programming and Scripting

need perl equivalent

Dear All, Good day, can any of you help me in the following problem: I need to find the perl equivalent for the following commandline grep characters |awk '{print \$2}'Expecting your reply and thanks in advance. Warm regards Fredrick. (4 Replies)
Discussion started by: Fredrick
4 Replies

9. Shell Programming and Scripting

strtok equivalent in perl

Hi All, Is their any equivalent for strtok (in c) to use in perl script. Thanks in advance. JS (1 Reply)
Discussion started by: jisha
1 Replies

10. Shell Programming and Scripting

export equivalent command in PERL

Hi I need an equivalent command in PERL for the following. export LC_ALL=C; I hope this is the command. Please confirm this and correct me if i am wrong $ENV{LC_ALL}="C"; Thanks and Regards Ammu (1 Reply)
Discussion started by: ammu
1 Replies
Login or Register to Ask a Question