grepを実行し、ファイル1のパターンがファイル2に表示される回数を印刷します。

grepを実行し、ファイル1のパターンがファイル2に表示される回数を印刷します。

以下の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

関連情報