Como posso obter uma contagem da frequência de linhas entre muitos arquivos?

1

Tenho muitos arquivos de texto (por exemplo, > > 2). Esses arquivos são quase todos semelhantes, mas possuem algumas pequenas diferenças entre eles. Eu gostaria de encontrar as linhas que aparecem mais comumente entre esses arquivos. Por exemplo, aqui está o tipo de informação que estou procurando (eu só me preocupo com os dados; de forma alguma é necessária qualquer formatação específica):

$ cat file1
line1line1line1
line2line2line2
line3line3line3
$ cat file2
line1line1line1
line2line2line2
$ cat file3
line1line1line1
line3line3line3
$ cat file4
line4line4line4
$ my_awesome_script file{1,2,3,4}
count | line
------+----------------
    3 | line1line1line1
    2 | line2line2line2
    2 | line3line3line3
    1 | line4line4line4

Existem algumas ferramentas comuns para executar tarefas semelhantes, no entanto, elas têm algumas limitações:

  • comm - só pode comparar dois arquivos de uma só vez; joga fora as linhas que não aparecem em ambos os arquivos
  • grep -f - joga linhas que não correspondem
  • grep -c - conta as correspondências, mas gera uma contagem total por arquivo e joga fora as informações sobre quais padrões de entrada correspondem a

Para esclarecer, se uma linha aparecer várias vezes em um arquivo, eu considero isso apenas como uma correspondência. Eu apenas me importo com quantos arquivos as linhas aparecem, não quantas vezes as linhas aparecem no total.

    
por jayhendren 29.11.2016 / 19:10

1 resposta

3

Algo como isso deve fazer o que você quer:

#! /bin/sh
for f in ./file*; do
    sort -u "$f"
done | \
    sort | \
    uniq -c | \
    sort -rn | \
    head -40

O ponto do for é garantir que cada linha seja contada apenas uma vez por arquivo. O ponto do restante do pipeline é contar as ocorrências.

    
por 29.11.2016 / 19:20