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 件の出現回数が取得されます。たとえば、1 つの文字がファイル内で 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}}}'