我在Perl的初學者,我想篩選大量文本文件ID名,分別由幾個字符的第1列長和獨特的,例如:過濾器的共同價值觀
Aghm
Tbc2
Popc
Ltr1
Iubr
Osv5
和反對用一些相同的ID名字的第二個文本文件過濾該列表,比如:
Popc
Iubr
Trv7
Ybd8
我只是想找到共同的ID名稱,並打印到一個新的文本文件。在上面我要生成列表的例子:
Popc
Iubr
我能如何使用perl腳本呢?
我在Perl的初學者,我想篩選大量文本文件ID名,分別由幾個字符的第1列長和獨特的,例如:過濾器的共同價值觀
Aghm
Tbc2
Popc
Ltr1
Iubr
Osv5
和反對用一些相同的ID名字的第二個文本文件過濾該列表,比如:
Popc
Iubr
Trv7
Ybd8
我只是想找到共同的ID名稱,並打印到一個新的文本文件。在上面我要生成列表的例子:
Popc
Iubr
我能如何使用perl腳本呢?
爲了讓你走上一條道路,你似乎做了一個Perl 過濾器。
您可以嘗試打開第一個文件,在鑽石運算符(即<>
)上循環並將選定行寫入第二個文件。
您應該嘗試獲得Perl Cookbook的副本,chapter 07正在處理這種情況。
具身份識別文件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
謝謝我正在使用awk函數,類似'awk -F「,」'NR == FNR {a [$ 1]; next}($ 1中的一個)'filter_ids.txt ids.txt',但沒有工作 - 我的文本文件可能太大了。你的建議很有用! – user1153710 2012-01-17 12:56:30
我無法想象如此。您是否嘗試過'awk'NR == FNR {a [$ 1] ++; next} a [$ 1]'filter_ids.txt ids.txt> filtered_ids.txt'? – flesk 2012-01-17 13:04:33
awk命令現在可用。 filter_ids文本文件不是製表符分隔的文本,儘管我確信我最初是以這種方式對其進行格式化 - 它不會允許awk生成結果,但現在可以正常使用上面的所有建議。再次感謝! – user1153710 2012-01-17 13:56:22
請給我們看你的嘗試 – Zaid 2012-01-17 11:17:14
@Zaid:如果OP是初學者,你的答案有點幹...... ... p – Seki 2012-01-17 11:59:21
@Seki:重要的是看到已經做出了努力。 – Zaid 2012-01-17 13:14:51