여기서 인쇄한 내용은 일치하지 않는 파일 내용입니다. 나는 그 반대로 하고 싶습니다. 즉, 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
줄의 시작 부분뿐만 아니라