file1 및 file2의 열과 일치하는 Perl 인쇄 행

file1 및 file2의 열과 일치하는 Perl 인쇄 행

여기서 인쇄한 내용은 일치하지 않는 파일 내용입니다. 나는 그 반대로 하고 싶습니다. 즉, 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};
}

이 질문을 참고하시면 됩니다두 파일을 첫 번째 열과 비교하고 쉘 스크립트의 두 번째 파일에서 중복 행을 제거합니다.. 중복 항목을 제거하고 싶지 않고 열 내용과 일치하는 항목을 인쇄하고 나머지 항목은 유지하고 싶습니다.

답변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줄의 시작 부분뿐만 아니라

관련 정보