2011-07-15 93 views

回答

544

假设有每行一个数:

sort <file> | uniq -c 

可以使用了更详细--count标志也与GNU版本,例如,在Linux上:

sort <file> | uniq --count 
+1

这是我做的算法,但这似乎并不是最有效的方法(O(n log n)* avg_line_len,其中n是行数)。我正在处理几千兆字节的文件,因此性能是一个关键问题。我想知道是否有一个工具只使用前缀树(在我的情况下,字符串通常具有通用前缀)或类似的一次性计数,这应该在O(n)* avg_line_len中执行。有谁知道这样的命令行工具? – Droggl

+10

另一个步骤是将输出管道输送到最终的“sort -n”命令中。这将排序最经常出现的结果。 – samoz

+19

如果只想打印重复行,请使用'uniq -d' – DmitrySandalov

7

假设你就可以访问一个标准的Unix shell和/或cygwin环境:

tr -s ' ' '\n' < yourfile | sort | uniq -d -c 
     ^--space char 

基本上是:将所有空格字符对换行符进行排序,然后对transeated输出进行排序并将其输出到uniq并对重复行进行计数。

58

要查找并计算在多个文件中重复的行,你可以试试下面的命令:

sort <files> | uniq -c | sort -nr 

或:

cat <files> | sort | uniq -c | sort -nr 
+7

+1来显示最常见的行 –

282

这将打印重复的行只,具有计数:

sort FILE | uniq -cd 

或者在GNU long选项下(在Linux上):

sort FILE | uniq --count --repeated 

BSD and OSX you have to use grep筛选出独特的线条:

sort FILE | uniq -c | grep -v '^ *1 ' 

对于给定的例子,其结果必然是:

3 123 
    2 234 

如果你想为打印计数所有行包括仅出现一次的行:

sort FILE | uniq -c 

,或者与GNU长选项(在Linux):

sort FILE | uniq --count 

对于给定的输入,输出为:

3 123 
    2 234 
    1 345 

为了排序输出与最频繁的行上,你可以做以下(获得所有结果):

sort FILE | uniq -c | sort -nr 

,或者只得到重复的行,最常见的第一:

sort FILE | uniq -cd | sort -nr 

在OSX和BSD最后一节变成:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr 
+1

使用--repeated或-d选项的好处。比使用“| grep 2”或类似的更精确! – Lauri

+0

如何修改此命令以检索重复次数超过100的所有行? –

+0

@Black_Rider添加'|排序-n或'|对管道进行排序-nr将按重复次数(分别为上升或下降)对输出进行排序。这不是你问的,但我认为它可能有帮助。 – Andrea

19

通过

awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data 

awk 'dups[$1]++'命令中,变量$1保存了column1和方括号的全部内容都是数组访问。因此,对于data文件中的每一行第一列,名为dups的数组的节点增加。

和结束时,我们遍历dups阵列num为变量和打印保存数字第一再由dups[num]其数量的重复值。

请注意,输入文件有一些线路的末端空间,如果你清楚了这些,你可以代替$1命令:)

+1

考虑到我们有'uniq',这不是过分夸张吗? –

+6

'sort | uniq和awk解决方案有着完全不同的性能和资源权衡:如果文件很大并且不同的行数很少,那么awk解决方案效率会更高。它的线数是线性的,空间使用率在不同线的数量上是线性的。 OTOH,awk解决方案需要保留内存中的所有不同行,而(GNU)排序可以使用临时文件。 –

7

上面使用“Windows PowerShell中”我用$0在windows使用以下提及的命令来实现这个

Get-Content .\file.txt | Group-Object | Select Name, Count 

此外,我们可以使用其中对象cmdlet过滤结果

Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count 
+0

是否可以删除除最后一个以外的所有副本......不改变文件的排序顺序? – jparram