0

Hi,

Please help in the below task using perl script

compare file1 and file2 and print the updated line in file2, should print new line added in file2 and print missing line from file2

Edited by Dev_9

3
Contributors
12
Replies
85
Views
4 Weeks
Discussion Span
Last Post by pty
2

Dear Dev_9,

Welcome to Daniweb and we are glad to help.

To start with you will have to show what you have done and where you are have a problem or then show the error codes or statement you your program is displaying.

You may also like to provide some data examples, as used in your program and indicate how you want the final output to look like. Showing what and what you are comparing.

Doing the above makes it possible for us to help you quickly and give relevant suggestions instaed of broad assumed options.

Looking forward to hearing from you.

0

Hi,

For example,

file1 data:

qwer
asdf
zxcv
poiu
lkjh

file2 data:

qwer
asdf
zubncv
poiu

As per the above, in file2 last line is missing and that should be printed out.
And then in file2 3rd line is modified which should be printed(example: zxcv is modified as zubncv)
And if new line is added in file2, that should be printed.

3

Hi,

Please show what you have done. Where are you having issues in your code? If the code is written for you, you will not know how to do it yourself.

I will be more that willing to help if you show what you have done.

0

open my $fh, '<' 'file1' or die $1;
chomp (my @arr1 = <$fh>);

open my $fh1, '<' 'file2' or die $1;
chomp (my @arr2 = <$fh1>);

my (%m1, %m2);

@m1{@arr2}=();
@m2{@arr1}=();

delete @m1{@arr2};
delete @m2{@arr1};

print "$ is the missing line from file1\n" for grep {exists $m2{$}} @arr1;

print "$ is the updated line from file2\n" for grep {exists $m1{$}} @arr2;

I'm getting output like,

It's printing the missing line from form file2 along with the file1 data that is modified line in file2
And for updated line,

It's printing the updated lines from file2 along with the newly added line in file2...

I want all to be printed seperatly... Please help on this

0

Hi,

I really don't understand what you wanted. If you want to comapre and print out line in file1 that is missing in file2 then this is NOT how you want to do it.

To start with, your code will not run as it is.
So am suprised that you said you have an output in the first place. In the code above, the open function line. You are supposed to use 3 option arguments type of open, but you had 2.

open my $fh, '<' 'file1' or die $1; # Note: $fh, '<' (there should be a comma here) 'file1'

Sedondly, when you use die $1 it should be die $!. Big difference between 1 and !. The $! has a different meaning to $1 in perl.

Lastly, check your print line. Am sure you wanted to use $_, but what you had is $, which doesn't make sense in this line.

Check the code below if it works for you or you could make it into what you wanted

use warnings;
use strict;

my $file1 = 'file1.txt';
my $file2 = 'file2.txt';

open my $fh, '<', $file2 or die $!;
my $file = [<$fh>];

open $fh, '<', $file1 or die $!;
while(my $line = <$fh>) {
    chomp($line);
    my $status = 0;
    for (@{$file}) {
        chomp;
        if (/$line/) {
            $status = 1;
            last;
        }
    }
    print $line, $/ if $status == 0 
}

Hope this helps

0

Hi,

It prints only the missing line from file2. I also need updated lines and newly added lines if any from file2.

Thanks,

0

Hello,

It prints only the missing line from file2. I also need updated lines and newly added lines if any from file2.

How do you mean by updated lines and newly added lines? Show with an example.

0

Please find the below example,

If file1 has the below data

aimee.neece,aimee,neece,aimee.neece@faculty.asdf.org,aimee neece,aimee neece,"CN=aimee neece,OU=Imported,dc=Faculty,dc=asdf,dc=org"
alexis.andrews,alexis,andrews,alexis.andrews@faculty.asdf.org,alexis andrews,alexis andrews,"CN=alexis
alice.lee,alice,lee,alice.lee@faculty.asdf.org,alice lee,alice lee,"CN=alice lee,OU=Imported,dc=Faculty,dc=asdf,dc=org"
allyson.knanishu,allyson,knanishu,allyson.knanishu@faculty.asdf.org,allyson knanishu,allyson knanishu,"CN=allyson knanishu,OU=Imported,dc=Faculty,dc=asdf,dc=org"

If file2 contains below data

aimee.neece,aimee,neece,aimee.neece@faculty.asdf.org,aimee neece,aimee neece,"CN=aimee
alexis.andrews,alexis,andrews,alexis.andrews@faculty.asdf.org,alexis andrews,alexis andrews,"CN=alexis
alice.lee,alice,lee,alice.lee@faculty.asdf.org,alice lee,alice lee,"CN=alice lee,OU=Imported,dc=Faculty,dc=asdf,dc=org"
allyson.knanishu,allyson,knanishu,allyson.knanishu@faculty.asdf.org,allyson knanishu,allyson knanishu,"CN=James knanishu,OU=Imported,dc=Faculty,dc=asdf,dc=org"
andrews,OU=Imported,dc=Faculty,dc=asdf,dc=org"

From the file2,

2nd line ie, "neece,OU=Imported,dc=Faculty,dc=asdf,dc=org" is deleted. This should be printed in deleted list.
New line ie, "andrews,OU=Imported,dc=Faculty,dc=asdf,dc=org" is added in file2. This should be printed in new line added list.
allyson is updated to James in file2. Which should be printed in updated lines list.

1

Working out the difference between two files is trivial using (like I said earlier) diff and comm, both of which have existed since at least the 1970s.

The two provided files, diffed by word. Red bits have been removed, green added.

Screen_Shot_2018-02-15_at_16_18_03.png

Now, comm outputs three columns

  1. lines only in file 1
  2. lines only in file 2
  3. lines in both files

So by default, lines that were deleted in file 2 will be in column 1, lines that were added in file 2 will be in column 2, and lines that remain unchanged will be in column 3. You can surpress columns using -1, -2 or -3, so we can run the command multiple times to get a nice summary.

Lines deleted in f2:
deleted.png

Lines added in f2:
added.png

Lines unchanged:
unchanged.png

0

Thanks for the commands. Btw, am looking this concept in perl scripting.

Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.