我正在比较下面两个文件的重复项
ac-list hostname permit tcp host 110.185.35.111 host 10.185.38.220 eq 1222
ac-list hostname permit tcp host 10.185.35.111 host 10.185.38.220 eq 1222
我的脚本如下
#!/usr/bin/perl
open( SOURCE, "</home/amp/surevy01/file1" );
open( DESTINATION, "</home/amp/surevy01/file2" );
while ( my $line = <SOURCE> ) {
while ( my $line1 = <DESTINATION> ) {
chomp( $line );
chomp( $line1 );
my @columns = split( ' ', $line );
my @gitcols = split( ' ', $line1 );
my $fld1 = $columns[4];
my $fld2 = $columns[5];
my $fld3 = $columns[6];
my $fld4 = $columns[7];
my $fld5 = $columns[9];
my $gitfld1 = $gitcols[4];
my $gitfld2 = $gitcols[5];
my $gitfld3 = $gitcols[6];
my $gitfld4 = $gitcols[7];
my $gitfld5 = $gitcols[9];
if ( $line == $line1
|| awk '/$fld1/ && /host/ && /$fld2/ && /$fld3/ && /$fld4/ && /$fld5/' $line1 ) {
print "\n All duplicate";
}
}
}
我收到以下错误:
字符串找到操作符在./perltest第25行,“awk'/ $ fld1 / && / host / && / $ fld2 / && / $ fld3 / && / $ fld4 / && / $ fld5 /'”附近(你需要吗?) preclare awk?) 标量找到运算符在./perltest第25行,“'/ $ fld1 / && / host / && / $ fld2 / && / $ fld3 / && / $ fld4 / && / $ fld5 /'$ line1”附近的位置(缺少运算符)在$ line1之前?) 语法错误在./perltest第25行,靠近“awk'/ $ fld1 / && / host / && / $ fld2 / && / $ fld3 /&& / $ fld4 / && / $ fld5 /'” ./perltest第30行的语法错误,靠近“}” 由于编译错误,./perltest的执行被中止。
但是,如果不使用awk
命令,我的脚本工作得很好。
虽然我不确定为什么这个“比较”对您有用,但以下代码执行您的代码似乎尝试执行的操作:
#!/usr/bin/perl
use strict;
use warnings;
my $file1 = shift || '/home/amp/surevy01/file1';
my $file2 = shift || '/home/amp/surevy01/file2';
my @cols = (4, 5, 6, 7, 9);
open(my $fh1, "<$file1") or die "Cannot open source: $file1\n";
open(my $fh2, "<$file1") or die "Cannot open destination: $file2\n";
while( my $line1 = <$fh1> ) {
chomp $line1;
my @cols1 = split ' ', $line1;
while( my $line2 = <$fh2> ) {
chomp $line2;
my @cols2 = split ' ', $line2;
my $count = 0;
foreach my $i ( @cols ) {
if( $cols1[$i] eq $cols2[$i] ) {
$count++;
}
}
if( $count == scalar @cols ) {
print "All duplicate\n";
}
}
seek $fh2, 0, 0;
}
关于您的代码,请注意:
awk
不是Perl命令。它是一种不同的编程语言。这解释了你得到的第一个错误。eq
; ==
用于比较数字。所以你应该使用$line eq $line1
。awk
在Perl脚本中使用system
,然后使用$?
获取返回状态,但这样效率非常低。另请注意,它所代表的代码会将第一个文件的每一行与第二个文件的所有行进行比较,没有任何上下文可以知道何时打印All duplicate
字符串。也许你的意思是并排比较两个文件。为此你可能想要检查diff
,结合选择正确的列,如cut
,awk
甚至perl
的东西将相对容易地进行并排比较。
如果您需要完成其他任务,您可能需要编辑您的问题,并说明您要实现的目标,并提供更长的输入文件以及预期的输出。