Contagem da aparência de uma variável em outro arquivo

4

Eu tenho a seguinte situação:

O File1 se parece com:

A  
B  
C  

O File2 se parece com:

chr1 \t 1234523 \t A  
chr3 \t 1234231 \t A  
chr6 \t 121233 \t A  
chr1 \t 1126685 \t B  
chr1 \t 15834523 \t B  
chr4 \t 12345647 \t C  
chr12 \t 1456523 \t C  

Eu gostaria de obter a saída:

A \t 3 
B \t 2  
C \t 2  

Eu sei que eu poderia fazer como

grep A File2 | wc -l

No entanto, eu precisaria fazer isso para cada linha no arquivo 1 (700).

Como posso automatizar isso?

    
por user30012 09.01.2013 / 17:59

3 respostas

1

Supondo que \t s sejam realmente guias, e que as ocorrências estejam na mesma coluna, e que A corresponda apenas A, não AA. Seja a o arquivo com A, B, C e b do arquivo onde você deseja contar as correspondências (o segundo que você forneceu).

  • Primeiro, você precisa obter apenas as correspondências possíveis de b , ignorando todo o resto. Esta é a terceira coluna de b , então podemos usar cut que é, bem, destinado a cortar partes de um arquivo

    cut -f 3 b

  • Depois, você precisa transformar isso em uma lista de ocorrências e suas contagens: você pode classificar e usar uniq para contabilizá-los, na saída de cut

    classificar | uniq -c

  • Por fim, você fez isso para todos valores em b , mas deseja apenas os de a . Você pode usar join , que une dois arquivos diferentes em campos comuns (neste caso, o primeiro e único campo de a (parece fazer isso por padrão) e o segundo campo ( 2 ) de b , que é o segundo arquivo ( -2 )

    junte-se a -2 2 a resultado-de-b

Você pode encadear isso de várias maneiras diferentes, uma maneira possível é usar pipes nomeados da substituição de processo de bash :

join -2 2 a <(cut -f 3 b | sort | uniq -c)

Isso deve pelo menos ser melhor que greps individuais, já que você processa apenas três vezes (remova outras colunas, sort e uniq ) e então suponha que a junção só lerá cada arquivo uma vez, já que requer a entradas a serem classificadas. É claro que isso se baseia nas suposições que fiz (e você também precisa classificar a , mas isso é apenas <(sort a) em vez de a se não foi classificado antes.

    
por 09.01.2013 / 20:39
0

Parece, a partir de sua entrada de amostra, que você deseja contar cada valor distinto no último campo dos registros separados por tabulação. Aqui está um fragmento de awk que faz isso.

awk -F '\t' '
     {++a[$NF]}
     END {for (x in a) {print x "\t" a[x]}}
' File2
    
por 10.01.2013 / 01:45
0

Você pode fazer isso com um loop while

while read arg < FILE1; do echo -n -e "$arg\t"; grep "$arg" FILE2 | wc -l; done

Isto lerá FILE1 e para cada linha o loop for armazenará a string na variável $ arg.

Ele irá ecoar o $ arg (-n significa não inserir um retorno de linha (\ n) no final, -e significa executar caracteres com exceção).

Em seguida, ele exibirá o número de ocorrências encontradas em $ arg no FILE2.

    
por 10.01.2013 / 01:49