Perl 打印与文件 1 和文件 2 的列匹配的行

Perl 打印与文件 1 和文件 2 的列匹配的行

这里我打印的是不匹配的文件内容。我想做反之亦然,即打印 file1 的行(那些在 file2 中匹配的行)

#!/usr/bin/perl

# create names lookup table from first file
my %names;
while (<>) {
    (my $col1)= split / /, $_;
    $names{$col1} = 1;
    last if eof;
}

# scan second file
while (<>) {
    print if /^(\S+).*/ && not $names{$1};
}

你可以参考这个问题将两个文件与第一列进行比较,并从 shell 脚本中的第二个文件中删除重复行。我不想删除重复项,我只想打印那些与列内容匹配的内容并保留其他内容。

答案1

正如 @choroba 在评论中指出的那样,您所需要做的就是删除not.这是一个稍微复杂的版本:

#!/usr/bin/perl

## Add command line switches
use Getopt::Std;

## This hash will hold the options
my %opts;

## Read the options
getopts('d',\%opts);

# create names lookup table from first file
my %names;
while (<>) {
    ## Remove trailing newlines. This is needed
    ## for cases where you only have a single word
    ## per line.
    chomp;

    my $col1=split(/\s+/, $_);
    $names{$col1} = 1;
    last if eof;
}
# scan second file
while (<>) {
    ## Skip any lines we don't care about
    next unless /^(\S+)/;

    ## Do we want the duplicates or not?
    defined $opts{d} ? 
        do{print if $names{$1}} :
        do{print unless $names{$1}};
}

-d如果使用标志 ( )运行上面的脚本foo.pl -d file,它将打印在两个文件中找到的名称,如果没有标志,它将打印仅在第一个文件中找到的名称。

请注意,您可以使用 做几乎相同的事情grep。要找到受骗者:

grep -wFf file1 file2

对于那些不会受骗的人来说:

grep -vwFf file1 file2

但是,上面的内容将匹配来自file1 任何地方在 中file2,不仅在行的开头。

相关内容