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