コマンドラインツールを使用して、並べ替えられた順序で重複をカウントする


82

ログファイルをgrepして一連の数値をフィルターで除外するコマンド(cmd1)があります。番号はランダムな順序であるため、sort -grを使用して、番号の逆ソートリストを取得します。このソートされたリスト内に重複がある可能性があります。そのリストで一意の番号ごとにカウントを見つける必要があります。

たとえば、cmd1の出力が次の場合:

100 
100 
100 
99 
99 
26 
25 
24 
24

上記の出力をパイプできる別のコマンドが必要なので、次のようになります。

100     3
99      2
26      1
25      1
24      2


回答:


94

どうですか。

$ echo "100 100 100 99 99 26 25 24 24" \
    | tr " " "\n" \
    | sort \
    | uniq -c \
    | sort -k2nr \
    | awk '{printf("%s\t%s\n",$2,$1)}END{print}'

結果は次のとおりです。

100 3
99  2
26  1
25  1
24  2

1
これを実行すると、最後に$ 1、$ 2の追加の印刷ステートメントが生成されました。 100 3 99 2 26 1 25 1 24 2 2 24
Mittenchops 2013年

3
以下はその結果の間に新しい行を追加し、最後に余分な行を削除します。 echo "100 100 100 99 99 26 25 24 24" | tr " " "\n" | sort | uniq -c | sort -k2nr | awk '{printf("%s\t%s\n",$2,$1)}END{print}' | head -n -1あなたが得るよう:100 3 99 2 26 1 25 1 24 2
ウッディ

構文については、円記号を使用する代わりにパイプで行を終了できます。
wjandrea

54

uniq -c 少なくともGNUuniq 8.23で動作し、必要なことを正確に実行します(ソートされた入力を想定)。


2
場合の入力がソートされていない場合は、単に追加sortのコマンドを:sort file_name | uniq -c
ミハイル・ガイヤー

驚くばかり。Mac OS Xでも動作します!Mojave10.14.6でテスト済み。
bappak

10

順序が重要でない場合

# echo "100 100 100 99 99 26 25 24 24" | awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(o in a) printf "%s %s ",o,a[o]}'
26 1 100 3 99 2 24 2 25 1

3本少ないパイプでこれを行うには+1。これがどのように機能するかを詳しく説明していただければ、私は混乱します。;-)ありがとう。
SaxDaddy 2014年

9

数字を逆に並べ替えてから、重複を数え、左右の単語を入れ替えます。列に揃えます。

printf '%d\n' 100 99 26 25 100 24 100 24 99 \
   | sort -nr | uniq -c | awk '{printf "%-8s%s\n", $2, $1}'
100     3
99      2
26      1
25      1
24      2

2

Bashでは、連想配列を使用して、各入力値のインスタンスをカウントできます。我々は、コマンドを持っていると仮定すると$cmd1、たとえば、

#!/bin/bash

cmd1='printf %d\n 100 99 26 25 100 24 100 24 99'

次に、関連する配列エントリで数学演算子aを使用して、配列変数の値をカウントでき++ます。

while read i
do
    ((++a["$i"]))
done < <($cmd1)

結果の値を出力できます。

for i in "${!a[@]}"
do
    echo "$i ${a[$i]}"
done

出力の順序が重要な場合sortは、キーの外部が必要になる場合があります。

for i in $(printf '%s\n' "${!a[@]}" | sort -nr)
do
    echo "$i ${a[$i]}"
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.