2013-10-22 4 views
0

검색 횟수가 많았습니까? 여기 펄 멍청이.Perl - 파일의 각 줄마다 특정 단어가 나타나는 횟수를 계산합니다.

텍스트 파일이 이미 데이터 라인에 정리되어 있습니다. 관심이있는 두 개의 문자열이 "hello"와 "goodbye"라고 가정 해보십시오. 첫 번째 줄을보고 "hello"와 "goodbye"가 몇 번이나 나오는지 계산하는 빠른 Perl 스크립트를 작성하고 싶습니다. 그런 다음 다음 줄로 이동하여 이전 계산에 추가합니다. 그래서 스크립트의 끝까지 파일의 각 문자열에 대한 전체 카운트 수를 출력 할 수 있습니다. 한 줄씩 접근하는 것이 중요한 이유는 여러 줄을 사용하여 두 단어가 같은 줄에 여러 번 인쇄 할 수 있기 때문입니다. 한 줄에는 단어 중 하나만 포함되어 있고 그 중 하나는 포함되지 않습니다. 기타, 한 줄에는 "hello"가 한 번 있지만 여러 번 "안녕히"여러 번 포함됩니다. 실제로 모든 단어가 전체 문서에 나타나는 횟수가 아니라 각 조건이 한 줄에 여러 번 표시됩니다.

지금까지 내가 생각하고 있어요 :

#!/usr/bin/perl 
use strict; use warnings; 

die etc (saving time by not including it here) 

my $word_a = "hello"; 
my $word_b = "goodbye"; 
my $single_both = 0; # Number of lines where both words appear only once. 
my $unique_hello = 0; # Number of lines where only hello appears, goodbye doesn't. 
my $unique_goodbye = 0; # Number of lines where goodbye appears, hello doesn't. 
my $one_hello_multiple_goodbye = 0; # Number of lines where hello appears once and goodbye appears multiple times. 
my $one_goodbye_multiple_hello = 0; # Number of lines where goodbye appears once and hello appears multiple times. 
my $multiple_both = 0; = # Number of lines where goodbye and hello appear multiple times. 

while (my $line = <>) { 

Magic happens here 

}; 

# then the results for each of those variables can be printed at the end. 

내가 말했듯이, 나는 멍청한 놈입니다. 나는 각 줄의 사건 수를 계산하는 방법에 대해서 혼란 스럽다. 위에 열거 한 모든 조건을 모두 파악할 수있을 것이라는 확신이 들더라도. 배열을 사용해야합니까? 해시? 아니면 내가 원하는 것을 고려하여 완전히 잘못된 방향으로 접근했다. 나는 그 변수들 뒤에 주석으로 나열한 조건들이 다른 라인들의 수를 세고 싶다. 어떤 도움이라도 대단히 감사합니다!

+1

좋은 시작이되어야합니다 :'$ line = ~/hello /) {print "안녕하세요. $ line \ n"}' –

+0

@mpapec : 그건 정말 hello를 계산하기 시작하지 않습니다. – ysth

+0

@ysth 다른 경우에도 사용할 수 있지만'/ g'이 더 유용하다는 데 동의합니다. –

답변

6

일부 단어의 출현은 정규식으로 계산할 수 있습니다. $hello =() = $line =~ /hello/g; 카운트 일부 파일 $lineHow it works?

perl -n -E '$hello =() = /hello/g; $goodbye =() = /goodbye/g; say "line $.: hello - $hello, goodbye - $goodbye"; $hello_total += $hello; $goodbye_total += $goodbye;}{say "total: hello - $hello_total, goodbye - $goodbye_total";' input.txt 

출력 hello 발생 :

line 1: hello - 0, goodbye - 0 
line 2: hello - 1, goodbye - 0 
line 3: hello - 1, goodbye - 1 
line 4: hello - 3, goodbye - 0 
line 5: hello - 0, goodbye - 0 
line 6: hello - 1, goodbye - 1 
line 7: hello - 0, goodbye - 0 
total: hello - 6, goodbye - 2 
0

펄 문자열 패턴과 일치하는 경우, 테스트 결속 연산자 =~있다. 문이 당신의 모든 라인에서 카운트를 꺼내 경우 두과 함께 사용하면 :

# only gathers counts 
while (my $line = <STDIN>) { 
    $hello_cnt++ if $line =~ /hello/; 
    $goobye_cnt++ if $line =~ /goodbye/; 
} 

하지만 라인하여 입력 라인에 대해 추론 할 것 같다, 당신은 모든 유지 수 이 변수의 : 지금 당신은이 구조의 해시를

my %seen; 
while (my $line = <STDIN>) { 
    chomp $line;     # remove trailing \n 

    map { 
     $seen{lc $_}++; 
    } split /\s+/, $line;   # split on whitespace 
} 

: $unique_hello, $unique_goodbye, 등등 ...하지만 나에게 추가 작업이 많은 것 같아, 당신이 할 수있는 횟수를 총하기 위해 해시 :

당신이 할, 희망이 좋은 출발점이 내가 선 분석에 의한 라인을 중단

print "Hello seen " . $seen{hello} . " times"; 
# etc ... 

:

{ 
    word1 => cnt1, 
    word2 => cnt2, 
    etc ... 
} 

지금 당신은 단지 합계를 인쇄 할 수 있습니다.

관련 문제