Linux命令或脚本计算文本文件中的重复行?

时间:2014-10-01 10:00:19

标签: linux text awk count duplicate-detection

我正在寻找像this之类的东西,但我不需要计算重复行的数量,而是计算重复行数。

为了澄清,我有一个这样的文件:

Separator
line11
line12
line13
Separator
line21
line22
line23
Separator
line11
line12
line13
Separator
line11
line12
line13
Separator
line31
line32
line33
Separator
line21
line22
line23

我会怀疑输出如下

3:    Separator
      line11
      line12
      line13
2:    Separator
      line21
      line22
      line23
1:   Separator
      line31
      line32
      line33

其中:3:,2:和1:表示每一行显示在文件中的次数。

我没有成功尝试以下命令:

sort all_lits.txt | uniq -c

目前我正在写一个awk命令以获取信息,但还没有清楚。只要我得到一些命令来表明我将要发布它。

是否可以使用某些UNIX工具组合获取此信息,例如awk,grep,wc,sort。等。?

我知道我可以写一个脚本来做,但我想避免这样做。在极端情况下,我会这样做。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

awk -v RS=Separator '
    NR>1 {count[$0]++}
    END {for (bunch in count) print count[bunch], RS, bunch}
' file
1 Separator 
line31
line32
line33

2 Separator 
line21
line22
line23

3 Separator 
line11
line12
line13

输出没有固有的顺序。如果你想按降序排序,你正在使用GNU AWK:

awk -v RS=Separator '
    NR>1 {count[$0]++}
    END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        for (bunch in count) print count[bunch], RS, bunch
    }
' file

答案 1 :(得分:1)

这是我正在使用的脚本。它仍在测试时间,但它可以作为其他人的基础:

with open(file_name, mode="r") as bigfile:
reader = bigfile.read()

d = dict()
for res in reader.split('Separator'):
  if res in d:
    d[res]= d[res]+1
  else:
    d[res]=1

for k in d:
  print str(k) + ':' + str(d[k])