对行的出现次数进行排序和计数


144

我有Apache日志文件,access.log该如何计算该文件中的行数?例如,结果cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'

a.php
b.php
a.php
c.php
d.php
b.php
a.php

我想要的结果是:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 

25
| sort | uniq -c
Costas 2014年

3
| LC_ALL=C sort | LC_ALL=C uniq -c
斯特凡Chazelas

啊,我不知道uniq能做到这一点..
Kokizzu 2014年

您是否在日志中有该行的示例,因为我认为可以使用awk来完成所有操作,而无需所有管道。

没关系,在大约2分钟内处理了8.1GB日志文件,并且现在已经完成,不再需要此文件了:3
Kokizzu 2014年

Answers:


195
| sort | uniq -c

如评论中所述。

将输出管道sort化为按字母/数字顺序组织输出。

这是一项要求,因为uniq仅匹配重复的行,即

a
b
a

如果uniq在此文本文件上使用,它将返回以下内容:

a
b
a

这是因为两个as由b- 分隔,它们不是连续的线。但是,如果您首先将数据按字母顺序排序,例如

a
a
b

然后uniq将删除重复行。该-c的选项uniq计数重复的数量,并提供输出形式:

2 a
1 b

参考文献:


1
欢迎使用Unix&Linux :)请随时在您的答案中添加更多详细信息,并解释其原因和作用方式;)
John WH Smith

1
printf '%s\n' ①.php ②.php | sort | uniq -c给我2 ①.php
斯特凡Chazelas

@StéphaneChazelasThats因为printf打印php\nphp

4
@Jidder,不,这是因为①.php排序与②.php我的语言环境相同,因为在我的语言环境中没有为那些字符定义排序顺序。如果你想要独一无二的任何字节值的值(记住文件路径不一定是文字),那么你需要修复的区域设置为C: | LC_ALL=C sort | LC_ALL=C uniq -c
斯特凡Chazelas

2
为了对结果计数文件进行排序,您应该考虑在下面的@ eduard-florinescu答案中添加“ sort -nr”。
LLUISSuñol

104
[your command] | sort | uniq -c | sort -nr

可接受的答案几乎是完整的,您可能希望sort -nr在末尾添加一个额外的内容,以便对结果进行排序,最常见的行最先出现

uniq选项:

-c, --count
       prefix lines by the number of occurrences

排序选项:

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

在特定情况下,如果要排序的行是数字,则需要使用sort -gr代替sort -nr,请参见注释


3
非常感谢您让我知道-n选择权。
Sigur

2
很好的答案,这是我用来从句子中删除单词计数的方法:tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt。第一个命令用换行符替换空格,从而使其余命令能够按预期工作。
酒吧

2
使用上面的选项,我在“ 23344”之前得到“ 1”。使用sort -gr代替可以解决此问题。-g:根据一般数值进行比较(而不是-n:根据字符串数值进行比较)。
Peter Jaric

@PeterJaric大有赶超和非常有用的了解-gr,但我认为的输出uniq -c会像这样 sort -nr将工作按照预期
爱德华Florinescu

3
实际上,当数据为数字时,-gr效果更好。尝试以下两个示例,仅在g和n标志方面有所不同:echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrecho "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr。第一个错误排序,但第二个错误。
Peter Jaric

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.