コマンドラインツールを使用してソートされたシーケンス内の重複をカウントする

コマンドラインツールを使用してソートされたシーケンス内の重複をカウントする

ログ ファイルを 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

関連情報