在文件中查找重复的行并计算每行复制的时间长度?

use*_*145 491 file lines count find duplicates

假设我有一个类似于以下的文件:

123 
123 
234 
234 
123 
345
Run Code Online (Sandbox Code Playgroud)

我想找出'123'重复多少次,重复'234'多少次等等.理想情况下,输出结果如下:

123  3 
234  2 
345  1
Run Code Online (Sandbox Code Playgroud)

won*_*nk0 746

假设每行有一个数字:

sort <file> | uniq -c
Run Code Online (Sandbox Code Playgroud)

您可以--count在GNU版本中使用更详细的标志,例如,在Linux上:

sort <file> | uniq --count
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想打印重复的行,请使用'uniq -d' (72认同)
  • 另一个步骤是将其输出传递给最终的'sort -n'命令.这将对最常出现线条的结果进行排序. (18认同)
  • 如果要再次对结果进行排序,则可以再次使用`sort`,例如:`sort &lt;file&gt; | uniq -c | 排序-n` (6认同)
  • 如果@DmitrySandalov 帽子没有提到 `-d` 我会采取 `... | uniq-c| grep -v '^\s*1' ` (`-v` 表示反向正则表达式,拒绝匹配(不详细,不版本:)) (4认同)
  • 这就是我所做的,但是在算法上这似乎不是最有效的方法(O(n log n)*avg_line_len,其中n是行数).我正在研究几千兆字节的文件,因此性能是一个关键问题.我想知道是否有一个工具只使用前缀树(在我的情况下字符串通常具有共同的前缀)或类似的单次传递中进行计数,这应该在O(n)*avg_line_len中执行.有谁知道这样的命令行工具? (2认同)

And*_*rea 383

这将仅打印重复行,计数:

sort FILE | uniq -cd
Run Code Online (Sandbox Code Playgroud)

或者,使用GNU长选项(在Linux上):

sort FILE | uniq --count --repeated
Run Code Online (Sandbox Code Playgroud)

BSD和OSX上,你必须使用grep来过滤掉唯一的行:

sort FILE | uniq -c | grep -v '^ *1 '
Run Code Online (Sandbox Code Playgroud)

对于给定的示例,结果将是:

  3 123
  2 234
Run Code Online (Sandbox Code Playgroud)

如果要打印所有行的计数,包括仅出现一次的行:

sort FILE | uniq -c
Run Code Online (Sandbox Code Playgroud)

或者,使用GNU长选项(在Linux上):

sort FILE | uniq --count
Run Code Online (Sandbox Code Playgroud)

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

  3 123
  2 234
  1 345
Run Code Online (Sandbox Code Playgroud)

为了对顶部最频繁的行进行排序,您可以执行以下操作(以获得所有结果):

sort FILE | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

或者,为了获得重复的行,最常见的是:

sort FILE | uniq -cd | sort -nr
Run Code Online (Sandbox Code Playgroud)

在OSX和BSD上,最后一个成为:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
Run Code Online (Sandbox Code Playgroud)

  • @fionbio看起来像[你不能在OSX uniq上一起使用-c和-d](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/uniq.1.html ).谢谢你指出.您可以[使用grep过滤掉独特的行](http://stackoverflow.com/a/5699355/2093341):`sort FILE | uniq -c | grep -v'^*1'` (4认同)

ken*_*orb 70

要查找和计算多个文件中的重复行,可以尝试以下命令:

sort <files> | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

要么:

cat <files> | sort | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

  • +1表示最常见的线条 (9认同)

αғs*_*нιη 28

通过:

awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Run Code Online (Sandbox Code Playgroud)

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

最后,我们dups使用num变量循环遍历数组并首先打印保存的数字,然后打印重复值的数量dups[num].

请注意,您的输入文件在某些​​行的末尾有空格,如果您清除它们,您可以使用$0代替$1上面的命令:)

  • `sort | uniq`和awk解决方案具有完全不同的性能和资源权衡:如果文件很大且不同行的数量很少,awk解决方案效率会更高.它的线数是线性的,并且空间使用在不同线的数量上是线性的.OTOH,awk解决方案需要将所有不同的行保存在内存中,而(GNU)排序可以使用临时文件. (9认同)
  • 考虑到我们有“uniq”,这不是有点矫枉过正吗? (2认同)

小智 19

要查找重复计数,请使用以下命令:

sort filename | uniq -c | awk '{print $2, $1}'
Run Code Online (Sandbox Code Playgroud)


vin*_*eel 12

在使用"Windows PowerShell"的Windows中,我使用下面提到的命令来实现此目的

Get-Content .\file.txt | Group-Object | Select Name, Count
Run Code Online (Sandbox Code Playgroud)

我们也可以使用where-object Cmdlet来过滤结果

Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Run Code Online (Sandbox Code Playgroud)


Mar*_*c B 6

假设您可以访问标准的Unix shell和/或cygwin环境:

tr -s ' ' '\n' < yourfile | sort | uniq -d -c
       ^--space char
Run Code Online (Sandbox Code Playgroud)

基本上:将所有空格字符转换为换行符,然后对转换后的输出进行排序,并将其输入到uniq并计算重复行.