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 deb
, então podemos usarcut
que é, bem, destinado a cortar partes de um arquivocut -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 decut
classificar | uniq -c
-
Por fim, você fez isso para todos valores em
b
, mas deseja apenas os dea
. Você pode usarjoin
, que une dois arquivos diferentes em campos comuns (neste caso, o primeiro e único campo dea
(parece fazer isso por padrão) e o segundo campo (2
) deb
, 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.