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
最後はawk
10以上の数に対応する行のみを印刷します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つの結果を提供します。sort
head
c
計算は、現在の入力行をキーとして連想配列の要素を増やすことによって行われます。
このEND
ブロック(最後に読み込まれた行以降に実行されますfile.log
)は、ブロック内のすべてのc
キーに対して繰り返され、そのキーに対応する数が10以上の場合、その数のある行と一緒に数が印刷されます。
答え3
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'