计算重复的几行

时间:2017-02-22 15:13:44

标签: bash vi

我有一个这种格式的配置文件:

cod    11
loc1   23
pto1   33
loc2   55
pto2   66
cod    12
loc1   55
pto1   66
loc2   88
pto2   77
...

我想计算一对数字在序列loc / pto中出现的次数(与loc / pto号无关)。在这个例子中,情侣55/66出现2次(一次是loc1 / pto1,一次是loc2 / pto2)。

我已经用Google搜索并尝试了grepuniqawk的某些组合,但我只管理了计数单行或数字重复。我阅读了那些命令的man文档,但没有发现任何与我的问题相关的线索。

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

$ sort file | uniq -f1 -dc
  2 loc1   55
  2 pto1   66

-f1在比较行

时正在跳过第一个字段

-dc正在打印重复的行及其关联计数

答案 1 :(得分:0)

如果您想知道文件中出现重复数字的次数:

awk '{print $2}' <filename> | sort | uniq -dc
Output:
2 55
2 66

如果您想知道某个号码出现在档案中的次数,无论是否重复:

awk '{print $2}' <filename> | sort | uniq -c
Output:
1 11
1 12
1 23
1 33
2 55
2 66
1 77
1 88

如果您想根据第二列打印重复匹配的整行:

awk '{print $2}' <filename> | sort | uniq -d | grep -F -f - <filename>
Output:
loc2   55
pto2   66
loc1   55
pto1   66

答案 2 :(得分:0)

尽管OP没有明显的努力,但这是一个有趣的问题。

awk '{for (i=1 ; i < 10 ; i++) if (NR == i) array[i]=$2} END {for (i=1 ; i < 10 ; i++) print array[i] "," array[i+1]}' file | sort | uniq -c

输出 -

  1 11,23
  1 12,55
  1 23,33
  1 33,55
  2 55,66
  1 66,12
  1 66,88
  1 88,

输出告诉你55后面是66两次。其他对只出现一次。

解释 -

我在awk中定义了一个数组,其中元素是第二列中的i数字。 END之后的部分连接ii+1元素。然后有sort | uniq -c来查看这些对是否出现不止一次。