特定の数値より大きい場合、ファイルの重複項目の並べ替え

特定の数値より大きい場合、ファイルの重複項目の並べ替え

file.log複数回表示される場合と表示されない可能性があるデータを含むファイルがあります。

a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e

現在sort file.log | uniq -c | sort -rn | head -n 10見つかった重複項目数に基づいてファイルを並べ替えていますが、最も頻繁に見つかる項目10個を取得しました。たとえば、ファイルに文字が5回表示されると、5その文字が表示されます。

ファイル内で特定の回数以上表示されるか、繰り返される文字を取得するために行を出力する方法は?たとえば、10回以上表示される文字のみを取得します。また、10個以上の重複がある文字に対して5個の結果のみを出力するなど、出力する文字数を定義する方が良いです。

答え1

指定された入力を使用して3回以上表示される文字を見つけるには、数を保持し、3回目の発生時に行を出力します。

$ awk '++count[$0] == 3' file
a
b

パイプを通る出力を制限しますhead。これは明らかに発生ごとにソートされません。これを行うには、GNU awkを使用してください。

gawk -v limit=3 '
    { ++count[$0] }
    END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        n = 0
        for (line in count) {
            if (n == limit) break
            print count[line], line
            ++n
        }
    }
' file

出力

6 a
3 b
2 d

参照番号https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

答え2

元のパイプラインの先頭を使用した後、awk次の結果をフィルタリングできます。

sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5

最後はawk10以上の数に対応する行のみを印刷しますhead非常にendは結果全体を最大5行に制限します。

しかし、もう少しできますawk

awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5

最初に計算を実行し、少数の行を消去してから、およびを使用してawk最初の5つの結果を提供します。sorthead

c計算は、現在の入力行をキーとして連想配列の要素を増やすことによって行われます。

このENDブロック(最後に読み込まれた行以降に実行されますfile.log)は、ブロック内のすべてのcキーに対して繰り返され、そのキーに対応する数が10以上の場合、その数のある行と一緒に数が印刷されます。

答え3

sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'

関連情報