2012-01-17 6 views
1

私は、Perlの初心者だと私は例えば、ユニークな長いID名、各数文字の1列に大きなテキストファイルをフィルタリングしようとしています:フィルター共通の価値観は

Aghm 
Tbc2 
Popc 
Ltr1 
Iubr 
Osv5 

と同じIDの名前の一部と2番目のテキストファイルに対して、このリストをフィルタリング、例えば:

Popc 
Iubr 
Trv7 
Ybd8 

は、私が唯一の共通IDの名前を検索して、新しいテキストファイルに印刷したいです。上記の例では、私は、リストを生成したい:

Popc 
Iubr 

は、どのように私はperlのスクリプトを使用してそれを行うことができますか?

+0

あなたの試み – Zaid

+0

@訴訟:OPが初心者の場合、あなたの答えは少し乾いています...:p – Seki

+0

@石:重要なことは、努力がなされたことを見ることです。 – Zaid

答えて

1

パスに入れるには、Perl フィルタを作成するようです。

ダイヤモンドオペレータ(つまり<>)をループし、選択した行を2番目のファイルに書き込むと、最初のファイルを開くことができます。

Perl Cookbookのコピーを入手してください。chapter 07は、このようなケースを扱っています。

#!/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 

結果、いずれの場合も、これはfiltered_ids.txtに望ましい結果を記述したIDファイルids.txt、フィルタファイルfilter_ids.txtを持つ

1

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

ありがとう私は 'awk -F "、" NR == FNR {a [$ 1]; next}($ 1の)' filter_ids.txt ids.txt'のようなawk関数を使用していましたが、ファイルが大きすぎる可能性があります。あなたの提案は治療になりました! – user1153710

+0

私はそれが事実であると想像することはできません。あなたは 'awk 'NR == FNR {a [$ 1] ++; next} a [$ 1]' filter_ids.txt ids.txt> filtered_ids.txt'を試しましたか? – flesk

+0

awkコマンドが機能するようになりました。 filter_idsテキストファイルは、タブ区切りのテキストではありませんでしたが、最初はこのようにフォーマットしましたが、awkは結果を生成できませんでしたが、上のすべての提案ではうまくいきました。再度、感謝します! – user1153710

関連する問題