Лучший способ группировки и подсчета строк на stdin?

Лучший способ группировки и подсчета строк на stdin?

С незапамятных времен я группировал ... | sort | uniq -c | sort -nrи подсчитывал входные строки, чтобы подсчитать, сколько строк каждой строки содержится во входных данных.

Есть ли лучший способ? Я просто приобрел плохую привычку? Есть ли лучший способ, используя стандартные инструменты Unix, которые будут установлены на Ubuntu Linux 18.04+ (или вещи, которые сейчас в apt-getотъезде?)

решение1

Я думаю, у вас стандартный, очевидный *nix-путь там. Это вполне хороший и разумный подход:

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
      2 cc
      2 aa
      1 dd
      1 bb

Конечно, вместо этого вы можете использовать небольшой скрипт и использовать только одну команду. Например, так 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

Или, перл:

$ 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

Но это просто изобретение велосипеда. Плюс, оба скрипта повторно загружают все входные данные в память, что может быть проблемой при работе с большими объемами данных. Так что просто продолжайте делать то, что делаете. Это прекрасное решение, возможно, самое эффективное из всех существующих.

Связанный контент