我有一个 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
我想 grep 并计算 file1 中的每个模式在 file2 中出现的次数,并获取一个表(制表符分隔),如下所示:
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])
这里我们使用了模块Counter
的类collections
,它将生成一个字典,其中包含可迭代的每个元素的出现次数。