2012-12-03 78 views
1

我在代碼的這一部分上花了幾個小時,但仍然不知道如何使其工作,所以任何建議都會很棒!(Perl)在文件中搜索另一個文件的文本


我有2個文件,list1.txt和dictionary.txt。 list1.txt看起來像

rs1 
rs2 
rs4 
rs5 

而dictionary.txt看起來像

rs1 1 A G 
rs2 2 C T 
rs3 3 A A 
rs4 4 G G 

列由空格分隔 - 有四列。 我想要做的是針對list1.txt中的每個單詞,搜索dictionary.txt中的單詞,如果存在,則將dictionary.txt中的整行打印到第三個文件中。如果這個單詞在dictionary.txt中不存在,就打印出這個單詞。

所以,如果我運行下面上面列出的文件的程序,我的結果應該

rs1 1 A G 
rs2 2 C T 
rs4 4 G G 
rs5 

上述程序:

open(LIST1, '<', 'test_chr1_22.txt') or die "Could not open chr1_22.txt: $!"; 

open(OUTPUT, '>', 'test_chr1_22_all_info.txt'); 

foreach my $line1 (<LIST1>) 
{ 
     foreach my $line (@DICT) 
     { 
      if ($line =~ m/"$line1"/) 
      { 
       print OUTPUT"$line\n"; 
      } 
     } 
} 

這是我的代碼現在。我知道它沒有我的第二個條件,如果單詞在字典中不存在,那麼就打印這個單詞。但是,我甚至無法解決第一部分,即如果單詞在字典中,那麼就打印該行。我從這個空白的文本文件中得到什麼。任何人都知道發生了什麼事?

+0

把使用嚴格;在代碼的頂部。你似乎沒有閱讀過@DICT,就像你已經閱讀過LIST1 – Himanshu

+0

我忘了在帖子中包含我的部分代碼,所以我確實擁有它。謝謝你的提醒! – Peter

回答

3

m/"$line1"/是錯誤的原因很多:

  • 你的字符串中沒有對與其匹配包含",所以這永遠不會匹配。
  • 你不能逃避$line1的內容,從任意文本形成正則表達式。
  • 如果在字符串的開始處找到文本,則只希望匹配。
  • 如果文本是整個字段,則只希望匹配。

無論如何,一旦你用一個循環和一個哈希查找替換效率極低的嵌套循環,對正則表達式匹配的需求就會消失。

my %dict; 
while (<$DICT>) { 
    my ($key) = split; 
    $dict{$key} = $_; 
} 

while (<$INPUT>) { 
    my ($key) = split; 
    print $dict{$key} // $_; 
} 
+0

謝謝!我剛剛開始學習Perl,因爲我正在開發這個項目,所以我仍然在努力弄清楚。但是,我仍然有一個問題。如何讓我的腳本打印出現在list1中但不在字典中的單詞?現在,它看起來只有當list1中的單詞出現在字典中時纔會打印該腳本。我可能是錯的 - 我還沒有試過你的代碼,因爲我現在不在我的計算機上。 – Peter

+0

如果密鑰不在字典中('// $ _') – ikegami

+0

啊,我現在看到了!它默認使用來自list1的行。再次感謝你!很有幫助 :) – Peter

相關問題