2012-01-17 54 views
1

我在Perl的初學者,我想篩選大量文本文件ID名,分別由幾個字符的第1列長和獨特的,例如:過濾器的共同價值觀

Aghm 
Tbc2 
Popc 
Ltr1 
Iubr 
Osv5 

和反對用一些相同的ID名字的第二個文本文件過濾該列表,比如:

Popc 
Iubr 
Trv7 
Ybd8 

我只是想找到共同的ID名稱,並打印到一個新的文本文件。在上面我要生成列表的例子:

Popc 
Iubr 

我能如何使用perl腳本呢?

+0

請給我們看你的嘗試 – Zaid 2012-01-17 11:17:14

+0

@Zaid:如果OP是初學者,你的答案有點幹...... ... p – Seki 2012-01-17 11:59:21

+0

@Seki:重要的是看到已經做出了努力。 – Zaid 2012-01-17 13:14:51

回答

1

爲了讓你走上一條道路,你似乎做了一個Perl 過濾器

您可以嘗試打開第一個文件,在鑽石運算符(即<>)上循環並將選定行寫入第二個文件。

您應該嘗試獲得Perl Cookbook的副本,chapter 07正在處理這種情況。

1

具身份識別文件ids.txt,過濾器文件filter_ids.txt這將寫入所需的結果filtered_ids.txt

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

open my $rh, '<', 'filter_ids.txt' or die "$!\n"; 

my %filter = map {$_ => 1} <$rh>; 

open $rh, '<', 'ids.txt' or die "$!\n"; 
open my $wh, '>', 'filtered_ids.txt' or die "$!\n"; 

map {print $wh $_} grep $filter{$_}, <$rh>; 

close $wh; 

個人而言,我寧願grep做到這一點:

grep -f filter_ids.txt ids.txt > filtered_ids.txt 

結果在這兩種情況下:

[email protected]:~$ more filtered_ids.txt 
Popc 
Iubr 
+0

謝謝我正在使用awk函數,類似'awk -F「,」'NR == FNR {a [$ 1]; next}($ 1中的一個)'filter_ids.txt ids.txt',但沒有工作 - 我的文本文件可能太大了。你的建議很有用! – user1153710 2012-01-17 12:56:30

+0

我無法想象如此。您是否嘗試過'awk'NR == FNR {a [$ 1] ++; next} a [$ 1]'filter_ids.txt ids.txt> filtered_ids.txt'? – flesk 2012-01-17 13:04:33

+0

awk命令現在可用。 filter_ids文本文件不是製表符分隔的文本,儘管我確信我最初是以這種方式對其進行格式化 - 它不會允許awk生成結果,但現在可以正常使用上面的所有建議。再次感謝! – user1153710 2012-01-17 13:56:22