awk从Perl脚本内的其他文件中搜索字段

问题描述 投票:0回答:1

我正在比较下面两个文件的重复项

file1

ac-list hostname permit tcp host 110.185.35.111 host 10.185.38.220 eq 1222

file2

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命令,我的脚本工作得很好。

perl
1个回答
0
投票

虽然我不确定为什么这个“比较”对您有用,但以下代码执行您的代码似乎尝试执行的操作:

#!/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;
}

关于您的代码,请注意:

  1. 正如您对问题的评论所述,awk不是Perl命令。它是一种不同的编程语言。这解释了你得到的第一个错误。
  2. Perl中的字符串比较是eq; ==用于比较数字。所以你应该使用$line eq $line1
  3. 您可以使用awk在Perl脚本中使用system,然后使用$?获取返回状态,但这样效率非常低。

另请注意,它所代表的代码会将第一个文件的每一行与第二个文件的所有行进行比较,没有任何上下文可以知道何时打印All duplicate字符串。也许你的意思是并排比较两个文件。为此你可能想要检查diff,结合选择正确的列,如cutawk甚至perl的东西将相对容易地进行并排比较。

如果您需要完成其他任务,您可能需要编辑您的问题,并说明您要实现的目标,并提供更长的输入文件以及预期的输出。

© www.soinside.com 2019 - 2024. All rights reserved.