내 도서 목록(txt 파일)에 아래와 같이 중복된 도서가 있습니다. -
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Joy on Demand: The Art of Discovering the Happiness Within
Crucial Conversations Tools for Talking When Stakes Are High
Joy on Demand
Search Inside Yourself: The Unexpected Path to Achieving Success, Happiness
Search Inside Yourself
......
......
......
중복된 도서를 찾아 확인 후 수동으로 삭제해야 합니다. 검색해보니 선에는 패턴이 필요하다는 것을 알았습니다.
전임자.
파일에서 부분적으로 반복되는 줄을 찾고 각 줄이 몇 번 반복되는지 계산하시겠습니까?
하지만내 경우에는 선의 패턴을 찾는 것이 어려웠다. 그러나 나는 단어의 순서에서 패턴을 발견했습니다.
세 개의 연속된 단어가 있는 줄만 중복으로 표시하고 싶습니다.(대소문자를 구분하지 않음).
보시면 알겠지만---
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Ideal Team Player
내가 찾고 있는 연속된 단어입니다.
출력이 다음과 같이 나타나기를 원합니다.
3 Ideal Team Player
2 Joy on Demand
2 Search Inside Yourself
......
......
......
어떻게 해야 하나요?
답변1
다음 awk
프로그램은 세 개의 연속 단어로 구성된 각 그룹의 발생 횟수를 저장하고(구두점이 제거된 후) 개수가 1보다 큰 경우 개수와 마지막 단어 그룹을 인쇄합니다.
{
gsub("[[:punct:]]", "")
for (i = 3; i <= NF; ++i)
w[$(i-2),$(i-1),$i]++
}
END {
for (key in w) {
count = w[key]
if (count > 1) {
gsub(SUBSEP," ",key)
print count, key
}
}
}
귀하의 질문에 텍스트가 주어지면 이는 다음과 같습니다.
2 Search Inside Yourself
2 Cultivate The Three
2 The Three Essential
2 Joy on Demand
2 Recognize and Cultivate
2 Three Essential Virtues
2 and Cultivate The
2 The Ideal Team
3 Ideal Team Player
보시다시피 이것은 그다지 유용하지 않을 수 있습니다.
대신, 동일한 개수 정보를 수집한 다음 파일을 두 번째로 통과하여 개수가 1보다 큰 단어 삼중항을 포함하는 각 줄을 인쇄할 수 있습니다.
NR == FNR {
gsub("[[:punct:]]", "")
for (i = 3; i <= NF; ++i)
w[$(i-2),$(i-1),$i]++
next
}
{
orig = $0
gsub("[[:punct:]]", "")
for (i = 3; i <= NF; ++i)
if (w[$(i-2),$(i-1),$i] > 1) {
print orig
next
}
}
파일을 테스트하십시오.
$ cat file
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Joy on Demand: The Art of Discovering the Happiness Within
Crucial Conversations Tools for Talking When Stakes Are High
Joy on Demand
Search Inside Yourself: The Unexpected Path to Achieving Success, Happiness
Search Inside Yourself
$ awk -f script.awk file file
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Joy on Demand: The Art of Discovering the Happiness Within
Joy on Demand
Search Inside Yourself: The Unexpected Path to Achieving Success, Happiness
Search Inside Yourself
경고: awk
프로그램에는 파일 텍스트의 약 3배를 저장할 만큼 충분한 메모리가 필요하며 항목이 실제로 중복되지 않더라도 일반적인 문구에서 중복 항목을 찾을 수 있습니다(예: "요리 방법"은 여러 제목의 주제일 수 있음). 서적).
답변2
IMO, 이 작업은 3개의 연속 단어를 찾는 것보다 단어 집합의 교차점을 사용하여 더 잘 해결됩니다.
따라서 다음 Perl 스크립트는 다음을 수행합니다.아니요연속된 단어 3개를 찾아보세요. 대신, 먼저 (표준 입력 및/또는 하나 이상의 파일에서) 전체 입력을 읽고 (사용하여)컬렉션::작은모듈)은 각 입력 라인에 대한 단어 세트를 생성합니다.
그런 다음 입력을 두 번째로 처리하고 (각 줄에 대해) 정확히 중복되거나 줄이 있는 첫 번째 패스에서 읽은 모든 줄을 인쇄합니다.교차로컬렉션에는3개 이상의 요소.
해시 배열을 사용하여 %sets
각 제목에 대한 단어 집합을 저장하고 또 다른 해시를 사용하여 %titles
각 제목을 본 횟수를 계산합니다. 이는 출력 단계에서 제목이 다음보다 더 자주 인쇄되지 않도록 하기 위해 사용됩니다. 입력에 표시되기 전에.
즉, 중복된 줄과 유사한 줄(예: 동일한 단어가 3개 이상 포함된 줄)을 나란히 인쇄합니다. 3개의 단어가 연속적일 필요는 없습니다.
스크립트는 컬렉션을 구축할 때 몇 가지 매우 일반적인 작은 단어를 무시하지만 이 기능은 주석 처리된 행을 주석 처리하거나 제거하여 비활성화할 수 있습니다 OPTIONAL...
. 또는 필요에 맞게 자주 사용되는 단어 목록을 편집할 수 있습니다.
스크립트의 작은 단어 목록에 단어가 포함되어 있다는 점을 언급할 가치가 있습니다 by
. 원한다면 목록에서 제거할 수 있지만 존재하는 이유는 by
플러스에서 스크립트가 일치하는 것을 방지하기 위한 것입니다.어느다른 두 단어 - 예를 들어 일치 Aardvark Taxidermy for Personal Wealth by Peter Smith
합니다 The Wealth of Nations by Adam Smith
(일치 by
및 ). 첫 번째 책은 (나는 희망한다) 전혀 존재하지 않지만 만약 존재했다면 그것은 경제학 교과서와도 전혀 관련이 없을 것이다.Wealth
Smith
참고: 이 스크립트는 각 입력 줄에 대한 관련 단어 집합과 함께 전체 입력을 메모리에 저장합니다. 몇 GiB의 사용 가능한 RAM이 있는 최신 시스템의 경우 입력이 매우 크지 않으면 문제가 되지 않습니다.
참고 2: Set::Tiny
Debian용으로 패키지되어 libset-tiny-perl
있으며 다른 배포판용으로도 사전 패키지되어 있습니다. 그렇지 않은 경우 위의 CPAN 링크에서 얻을 수 있습니다.
#!/usr/bin/perl -w
use strict;
use Set::Tiny;
# a partial list of common articles, prepositions and small words joined into
# a regex.
my $sw = join("|", qw(
a about after against all among an and around as at be before between both
but by can do down during first for from go have he her him how
I if in into is it its last like me my new of off old
on or out over she so such that the their there they this through to
too under up we what when where with without you your)
);
my %sets=(); # word sets for each title.
my %titles=(); # count of how many times we see the same title.
while(<>) {
chomp;
# take a copy of the original input line, so we can use it as
# a key for the hashes later.
my $orig = $_;
# "simplify" the input line
s/[[:punct:]]//g; #/ strip punctuation characters
s/^\s*|\s*$//g; #/ strip leading and trailing spaces
$_=lc; #/ lowercase everything, case is not important.
s/\b($sw)\b//iog; #/ optional. strip small words
next if (/^$/);
$sets{$orig} = Set::Tiny->new(split);
$titles{$orig}++;
};
my @keys = (sort keys %sets);
foreach my $title (@keys) {
next unless ($titles{$title} > 0);
# if we have any exact dupes, print them. and make sure they won't
# be printed again.
if ($titles{$title} > 1) {
print "$title\n" x $titles{$title};
$titles{$title} = 0;
};
foreach my $key (@keys) {
next unless ($titles{$key} > 0);
next if ($key eq $title);
my $intersect = $sets{$key}->intersection($sets{$title});
my $k=scalar keys %{ $intersect };
#print STDERR "====>$k(" . join(",",sort keys %{ $intersect }) . "):$title:$key\n" if ($k > 1);
if ($k >= 3) {
print "$title\n" if ($titles{$title} > 0);
print "$key\n" x $titles{$key};
$titles{$key} = 0;
$titles{$title} = 0;
};
};
};
예를 들어 로 저장 blueray.pl
하고 실행 가능하게 만듭니다 chmod +x
.
새로운 샘플 입력이 주어지면 다음과 같은 출력이 생성됩니다.
$ ./blueray.pl TestData.txt
7L: The Seven Levels of Communication
The Seven Levels of Communication: Go From Relationships to Referrals by Michael J. Maher
A History of Money and Banking in the United States: The Colonial Era to World War II
The History of Banking: The History of Banking and How the World of Finance Became What it is Today
America's Bank: The Epic Struggle to Create the Federal Reserve
America's Money Machine: The Story of the Federal Reserve
Freakonomics: A Rogue Economist
Freakonomics: A Rogue Economist Explores the Hidden
Freakonomics: A Rogue Economist Explores the Hidden
Freakonomics: A Rogue Economist Explores the Hidden Side of Everything by Steven Levitt
Money Master the Game by Tony Robbinson
Money Master the Game by Tony Robbinson
Money Master the Game by Tony Robbinson
The Federal Reserve and its Founders: Money, Politics, and Power
The Power and Independence of the Federal Reserve
Venture Deals by Brad Feld
Venture Deals by Brad Feld & Jason Mendelson
Zen and the Art of Motorcycle Maintenance: An Inquiry into Values
Zen and the Art of Motorcycle Maintenance: An Inquiry into Values
이는 예제 출력과 정확히 동일하지 않습니다. 정확한 순서를 무시하고 제목에 흔한 단어가 있는지 확인하기 때문에 오탐 가능성이 더 높습니다.그리고놓쳐서는 안되는 게임을 놓칠 가능성이 적습니다(거짓 부정).
시도해 보거나 어떤 단어가 일치하는지(또는 거의 일치하는지) 확인하려면 이 #print STDERR
줄의 주석 처리를 취소하세요.