以下のfile1(私のパターンリスト)があります。
ファイル1
Fatty_acid_degradation
Aminobenzoate_degradation
Amino_sugar_and_nucleotide_sugar_metabolism
Amoebiasis
私はfile2(すべてのパターンリスト)を持っています。
ファイル2
Fatty_acid_degradation
Fatty_acid_degradation
Fatty_acid_degradation
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
file1の各パターンがfile2に表示される回数をgrepして計算し、次のテーブル(タブで区切った)を取得したいと思います。
Fatty_acid_degradation 3
答え1
最も簡単な方法は、grep
各パターンを数えて計算することです。
$ grep -Fwf file1 file2 | sort | uniq -c
3 Fatty_acid_degradation
オプションgrep
は-f
、検索するパターンのリストとしてファイルを提供し、パターンを-F
正規表現ではなく文字列として扱う必要があることを指定し、パターンが単語全体に一致することを-w
確認することです(したがって、反対とregulation_of_expression
一致しません)。upregulation_of_excpression
。
その後、目的のツールを使用してフォーマットを変更できます。
$ grep -Fwf file1 file2 | sort | uniq -c | sed -r 's/.*([0-9]+) *(.*)/\2\t\1/'
$ grep -Fwf file1 file2 | sort | uniq -c | perl -lane 'print "$F[1]\t$F[0]"'
$ grep -Fwf file1 file2 | sort | uniq -c | awk -vOFS="\t" '{print $2,$1}'
上記の項目をすべて返してください。
Fatty_acid_degradation 3
答え2
grep -f file1 file2 | sort | uniq -c
これにより、次の形式で出力が提供されます。
3 Fatty_acid_degradation
耐えられますか?
答え3
答えが多すぎてパニックになります...
awk 'FNR == NR { pat[$1]=0 ; next ; }
{ if ( $0 in pat ) pat[$0]++ ; }
END { for ( p in pat ) if ( pat[p]) printf "%s %d\n",p,pat[p] ;}' f1 f2
どこ
FNR == NR { pat[$1]=0 ; next ; }
Pat配列にパターンを書き込む{ if ( $0 in pat ) pat[$0]++ ; }
一致する項目があるたびに計算END { for ( p in pat ) if ( pat[p]) printf "%s %d\n",p,pat[p] ;}
最後に、ゼロ以外の数をダンプします。
答え4
Pythonを使用して次の解決策を試すこともできます。
#!/usr/bin/env python2
import collections
with open('file_1') as f1, open('file_2') as f2:
counts = collections.Counter(f2)
for line in f1:
if line in counts:
print line.rstrip() + '\t' + str(counts[line])
ここでは、iterableで各要素の発生回数を含む辞書を生成するモジュールのCounter
クラスを使用しました。collections