Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在文件中查找重复的行并计算每行重复的次数?_File_Count_Find_Duplicates_Lines_Awk - Fatal编程技术网

File 在文件中查找重复的行并计算每行重复的次数?

File 在文件中查找重复的行并计算每行重复的次数?,file,count,find,duplicates,lines,awk,File,Count,Find,Duplicates,Lines,Awk,假设我有一个类似于以下内容的文件: 123 123 234 234 123 345 我想知道“123”被复制了多少次,“234”被复制了多少次,等等。 因此,理想情况下,输出如下: 123 3 234 2 345 1 假设每行有一个数字: sort <file> | uniq -c 假设您可以访问标准Unix shell和/或cygwin环境: tr -s ' ' '\n' < yourfile | sort | uniq -d -c ^

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

123 
123 
234 
234 
123 
345
我想知道“123”被复制了多少次,“234”被复制了多少次,等等。 因此,理想情况下,输出如下:

123  3 
234  2 
345  1

假设每行有一个数字:

sort <file> | uniq -c

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

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

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

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

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

cat | sort | uniq-c | sort-nr

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

sort FILE | uniq -cd
或者,使用GNU长选项(在Linux上):

打开以筛选出唯一的行:

sort FILE | uniq -c | grep -v '^ *1 '
对于给定的示例,结果将是:

  3 123
  2 234

如果要打印所有行的计数,包括只显示一次的行:

sort FILE | uniq -c
或者,使用GNU长选项(在Linux上):

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

  3 123
  2 234
  1 345

要对输出进行排序,使最频繁的行位于顶部,可以执行以下操作(以获得所有结果):

或者,要仅获取重复的行,最常见的是:

sort FILE | uniq -cd | sort -nr
在OSX和BSD上,最后一个成为:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
通过:

awk'{dups[$1]+}END{for(dups中的num){print num,dups[num]}数据
awk'dups[$1]+'
命令中,变量
$1
包含第1列的全部内容,方括号是数组访问。因此,对于
数据
文件中每行的第1列,名为
dups
的数组的节点都会递增

最后,我们将以
num
作为变量在
dups
数组上循环,首先打印保存的数字,然后通过
dups[num]
打印复制值的数量

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

在windows中使用“windows PowerShell”我使用了下面提到的命令来实现这一点

Get-Content .\file.txt | Group-Object | Select Name, Count
我们还可以使用where-object Cmdlet筛选结果

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

要查找重复计数,请根据您的要求使用以下命令:

sort filename | uniq -c | awk '{print $2, $1}'

您想使用哪种语言?使用--repeated或-d选项很好。比使用“| grep 2”或类似工具准确得多!如何修改此命令以检索重复计数超过100的所有行?@Black_Rider将
|sort-n
|sort-nr
添加到管道中,将按重复计数(分别升序或降序)对输出进行排序。这不是你要问的,但我认为这可能会有所帮助。@Black_Rider awk似乎能做各种计算:在你的情况下,你可以做
|awk'$1>100'
@fionbio看起来像。谢谢你指出。您可以:
sort FILE | uniq-c | grep-v'^*1'
这是我所做的,但是从算法上看,这似乎不是最有效的方法(O(n log n)*avg_line_len,其中n是行数)。我正在处理几GB大小的文件,所以性能是一个关键问题。我想知道是否有一种工具可以使用前缀树(在我的例子中,字符串通常有共同的前缀)或类似的方法在单次传递中进行计数,它应该在O(n)*avg_line_len中完成这一技巧。有人知道这样一个命令行工具吗?另一个步骤是将它的输出通过管道传输到最后的“sort-n”命令中。这将按最常出现的行对结果进行排序。如果只想打印重复行,如果要再次对结果进行排序,请使用“uniq-d”,您可以再次使用
sort
,比如:
sort | uniq-c | sort-n
考虑到我们有
uniq
sort | uniq
和awk解决方案有着完全不同的性能和资源权衡:如果文件很大,不同行的数量很小,awk解决方案的效率要高得多。它在行数上是线性的,而空间使用在不同行数上是线性的。OTOH,awk解决方案需要在内存中保留所有不同的行,而(GNU)排序可以求助于临时文件。您是否可以删除除最后一个之外的所有重复项…而不更改文件的排序顺序?我猜此解决方案是针对您自己的特定情况定制的?i、 你有一个单词列表,只用空格或换行符隔开。如果它只是一个由换行符(没有空格)分隔的数字列表,那么它在那里可以正常工作,但显然您的解决方案将以不同的方式处理包含空格的行。
sort FILE | uniq -cd | sort -nr
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
Get-Content .\file.txt | Group-Object | Select Name, Count
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
sort filename | uniq -c | awk '{print $2, $1}'