2017-06-19 51 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唯一的行,第三列包含兩個文件共有的行。

相關問題