首页 > 解决方案 > 有没有办法擦除文件中的所有重复项并计算有多少重复项,同时保持文件的原始顺序

问题描述

我有这样的文件

2/2
2/2
2/2
3/3
1/1
1/1
2/2
1/1
3/3

ETC..

我想删除单个数字的所有重复项并计算每个数字有多少个,但保持它们的原始顺序是这样的

4 2/2
2 3/3
3 1/1

我试过了

sort myfile.txt | uniq -c

但这会返回这样的输出,并且不会按照文件中第一个实例的顺序保留它

2 3/3
4 2/2
3 1/1

我也单独尝试了 uniq -c ,但这并没有删除所有重复项。我在最新的内核上运行 Arch Linux,所以我需要命令来解决这个问题。

抱歉,这太令人困惑了,但我们将不胜感激:)

标签: linuxshelltextcommand-linearchlinux

解决方案


像这样的东西会起作用:

awk '
  # This first line simply ensures that `order` is an array
  BEGIN {delete order[0]}
  ! ($1 in seen) {order[length(order)+1] = $1}
  {seen[$1]++} 
  END {for (i in order) print seen[order[i]], order[i]}
' data.txt

在这个脚本中,我们维护了两个关联数组(“字典”或其他语言中的“哈希”):

  • order记录我们遇到新值的顺序,以及
  • seen记录我们看到特定值的次数

处理完数据后,我们遍历以按它们出现的顺序获取值,并在数组order中查找它们的计数。seen

给定您的示例输入,这将产生:

4 2/2
2 3/3
3 1/1

推荐阅读