这里我打印的是不匹配的文件内容。我想做反之亦然,即打印 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
,不仅在行的开头。