如果大于一定数量,则对文件中的重复项进行排序

如果大于一定数量,则对文件中的重复项进行排序

我有一个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给出前五个结果。sorthead

计数是通过递增关联数组中的元素来完成的c,其中当前输入行用作键。

END块(在读取 的最后一行后触发file.log)迭代 中的所有键c,如果该键对应的计数大于或等于 10,则该计数将与具有该计数的行一起打印。

答案3

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

相关内容