2017-06-19 52 views
1

我有两个文件,文件A可能在文件B中,我想为文件A中的每一行计数,文件B中出现多少次。例如:Grep统计文件B中文件A的发生

文件:

GAGGACAGACTACTAAAGCC 
CTTGCCGCAGATTATCAGAG 
CCAGCTTGATGTGTCCTGTG 
TGATAGGCAGTGGAACACTG 

文件B:

NTCTTGAGGAAAGGACGAATCTGCGGAGGACAGACTACTAAAGCCGTTTGAGAGCTAGAACGAGCAAGTTAAGAGA 
TCTTGAGGAAAGGACGAAACTCCGGAGGACAGACTACTAAAGCCGTTTTAGAGCTAGAAAGCGCAAGTTAAACGAC 
NTCTTGAGGAAAGGACGAATCTGCGCTTGCCGCAGATTATCAGAGGTATGAGAGCTAGAACGAGCAAGTTAAGAGC 
TCTTGAGGAAAGGACGAAAGTGCGCTTGCCGCAGATTATCAGAGGTTTTAGAGCTAGAAAGAGCAAGTTAAAATAA 
GATCTAGTGGAAAGGACGATTCTCCGCTTGCCGCAGATTATCAGAGGTTGTAGAGCTAGAACTAGCAAGTGACAAG 
ATCTTGAGGAAAGGACGAATCTGCGCTTGCCGCAGATTATCAGAGGTTTGAGAGCTAGAACTAGCAAGTTAATAGA 
CGATCAAGTGGAAGGACGATTCTCCGTGATAGGCAGTGGAACACTGGATGTAGAGCTAGAAATAGCAAGTGAGCAG 
ATCTAGAGGAAAGGACGAATCTCCGTGATAGGCAGTGGAACACTGGTATGAGAGCTAGAACTAGCAAGTTAATAGA 
TCTTGAGGAAAGGACGAAACTCCGTGATAGGCAGTGGAACACTGGTTTTAGAGCTAGAAAGCGCAAGTTAAAAGAC 

并输出应为文件C:

2 GAGGACAGACTACTAAAGCC 
4 CTTGCCGCAGATTATCAGAG 
0 CCAGCTTGATGTGTCCTGTG 
3 TGATAGGCAGTGGAACACTG 

我想这样做使用grep,我已经尝试了一些-c,o,f的变体,但我似乎无法得到正确的输出。

我该如何做到这一点?

+0

用四个空格前缀代码/数据。请看[编辑帮助](http://stackoverflow.com/editing-help)。 – Cyrus

回答

0

尝试此

for i in `cat a`; do echo "$i `grep $i -c b`"; done 

在这种情况下,如果发生了从文件中的行多次在文件B中的一行,则这将被算作一个发生。如果你想算这样的事件,但没有它的重复使用这个

for i in `cat a`; do printf $i; grep $i -o b | wc -l; done 

也许这变种会更快

cat b | grep "`cat a`" -o | sort | uniq -c 
+0

谢谢,这工作,但它真的很慢。任何想法如何加快它?我的文件A是数百行,fileB是数百万行。 – akt001

0
#!/usr/bin/perl 
open A, "A";     # open file "A" to handle A 
open B, "B";     # open file "B" to handle B 
chomp(@keys = <A>);   # read keys to array, strip line-feeds 
@counts{@keys} = (0) x @keys; # initialize hash counts for keys 
while(<B>){     # iterate file handle B line by line 
    foreach $k (@keys){  # iterate keys array 
     if (/$k/) {   # if key matches line 
      $counts{$k}++;  # increase count for key by one 
     } 
    } 
} 
print "$counts{$_} $_\n" for (keys %counts); 
0

Linux命令比较文件:

comm FileA FileB 

comm产生三列输出。第一列包含FileA唯一的行,第二列包含FileB唯一的行,第三列包含两个文件共有的行。

相关问题