2016-12-12 2 views
1

こんにちは、あるファイルに含まれている単語(英数字)のセットが、ファイル内の文字列が別のファイルにあるかどうかを確認するか、Pythonまたはbashを使用しないでください

私は、ファイル持っているように:f1.txt(20Kサイズ)

w1 
w2 
w3 
w4 
.. //more ids like this 

別のファイルf2.txt(120 Kサイズ)

q1 
q2 
q3 
q4 
q5 
q6 
q7 
q8 
w2 

は、だから私は "どのように" 多くのを確認したいですそして「これは」「f1.txt」からIDが「f2.txt」に存在している

私は、出力は次のようになりたい:

1 
w2 

私はこれが簡単で、ループを使って行うことができることを知っています。 "grep" n allを使って、bashスクリプトを使ってこれを行うことができるかどうかを知りたい。これは速いので、主にデータを分析したいと考えています。 Pythonでもやります。

いずれかのリードが評価されました。

+0

awkは、おそらくこれを行うための最速の方法(あなたがCまたはいくつかの他のコンパイル言語で何かを書いていない限り)です。間違いなく、f1を解析し、そのデータをgrep f2に使用するBashスクリプトを使用して、これを実行しようとしないでください。それはむしろ遅くなります。さらに、テキストを処理するシェルループを使用するのは悪い方法です。 /unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。 –

答えて

1

あなたは

を使用することができます

str.count(sub[, start[, end]])

戻り範囲[start, end]におけるサブsubの非重複出現数。オプションの引数startendはスライス表記と解釈されます。あなたはF1データのセットを使用した場合、Pythonはかなり速いだろうが、

f1_lines = [line.strip("\n") for line in f1.readlines()] 
f2_lines = [line.strip("\n") for line in f2.readlines()] 

for w in f1_lines: 
    print(w, f2_lines.count(w)) 
3

ファイルがそれほど大きくないので、私たちは比較するメモリ(awkのハッシュテーブルを)それらを置くことができます。

awk 'NR==FNR{a[$0];next}$0 in a{a[$0]++} 
    END{for(x in a)if(a[x])print x, a[x]}' f1 f2 

それは出力:

w2 1 

(出力は一例です、出力フォーマットを容易に調整することができます。)

awk     # the awk cmd 
'NR==FNR{a[$0];next} # take the first file:f1, save in hashtable a[word]=0 
$0 in a{a[$0]++}  # take the 2nd file:f2, if word in a hit, increment 
END{     # after two files are processed, we r about to print 
    for(x in a)   # go thru the hashtable 
    if(a[x])   # if value>0 (the word shows in f2) 
    print x, a[x]}' # we print the which word(key), and how many times(value) 
f1 f2     # two input files. 
+0

コマンドを説明してください。 – user2696258

+0

@ user2696258回答が – Kent

+0

で更新されていることを確認してください。大きなデータセットでは正しく動作していません。私はf2.txtにないidについても2を示します。 – user2696258

関連する問題