
Desde tempos imemoriais eu costumava ... | sort | uniq -c | sort -nr
agrupar e contar linhas de entrada, para contar quantas de cada linha existem na entrada.
Existe alguma maneira melhor? Acabei de adquirir um mau hábito? Existe uma maneira melhor de usar ferramentas unix padrão que serão instaladas no Ubuntu Linux 18.04+ (ou coisas que estão distantes apt-get
?)
Responder1
Eu acho que você tem o caminho *nix padrão e óbvio. É uma abordagem perfeitamente boa e razoável:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
2 cc
2 aa
1 dd
1 bb
Claro, você poderia usar um pequeno script e usar apenas um comando. por exemplo, com gawk
:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' |
gawk '
BEGIN{ PROCINFO["sorted_in"] = "@val_num_desc" }
{ count[$0]++ }
END{ for(line in count){ print count[line],line}}'
2 cc
2 aa
1 dd
1 bb
Ou perl:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' |
perl -lne '$k{$_}++ }{ for $i (sort { $k{$b} <=> $k{$a} } keys %k ){print "$k{$i} $i"}'
2 aa
2 cc
1 bb
1 dd
Mas isso é apenas reinventar a roda. Além disso, ambos os scripts recuperam o carregamento de todas as entradas na memória, o que pode ser um problema ao lidar com grandes quantidades de dados. Portanto, continue com o que você está fazendo. É uma boa solução, provavelmente a mais eficiente que existe.