我有一个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
使用给定的输入,如果您想查找哪些字符出现大于或等于三次:保留计数并在第三次出现时输出该行
$ 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 将整体结果限制为最多五行。
不过你可以多做一点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
给出前五个结果。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}}}'