
ログ ファイルを grep して一連の数字をフィルターするコマンド (cmd1) があります。数字はランダムな順序になっているため、これを使用してsort -gr
逆順に並べ替えられた数字のリストを取得します。この並べ替えられたリストには重複がある可能性があります。そのリスト内の一意の数字の数を見つける必要があります。
たとえば、cmd1の出力が
100 100 100 99 99 26 25 24 24
上記の出力をパイプできる別のコマンドが必要です。次のようになります。
100 3 99 2 26 1 25 1 24 2
答え1
出力が少し異なる形式であっても処理できる場合は、次のようにします。
cmd1 | tr " " "\n" | uniq -c
返される結果は次のとおりです:
3 100
2 99
1 26
1 25
2 24
答え2
また、-u スイッチを追加します。次のようになります。
cmd1 | sort -gru
sort のマニュアルページから:
-u、--unique を-c なしで実行すると、等しい実行の最初のものだけを出力します。
答え3
(sort の出力は 1 行に 1 つの数値なので、入力は 1 行に 1 つの数値であると想定しています。)
awk を試すこともできます:
<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'
これにより、ソートされていないリストが生成されます (私の知る限り、awk で配列が処理される順序は未定義です)。そのため、好みに応じて再度ソートする必要があります。
答え4
$ echo '100 100 100 99 99 26 25 24 24' | perl -e 'while (<>) { chomp; my %nums; foreach (split(/ /)) { $nums{$_} += 1; }; foreach (sort {$b <=> $a} keys %nums) { print "$_ $nums{$_} " }; print "\n"; }'
100 3 99 2 26 1 25 1 24 2