输出bash中的最大重复行

时间:2015-04-13 20:57:20

标签: bash

我在bash中有一个以下格式的输出,来自我编写的脚本,它返回特定目录中重复文件名的数量和文件名本身。

 19 prob561493
 19 prob564972
 19 prob561564
 11 prob561965
  8 prob562172
  7 prob564449
  6 prob564155
  6 prob562925
  6 prob562739

使用output | head -n1,我可以获得上述输出的第一个条目以获得19 prob561493。但是,我还想打印出其他共享相同数量的最大重复项的问题,因此在这种情况下,最终输出应该是这样的:

  19 prob561493
  19 prob564972
  19 prob561564

我尝试cut -d" " | uniq -c先获取输出的整数,然后只显示唯一的结果,但返回了所有重复的结果。

如何只打印重复的最大重复行?

5 个答案:

答案 0 :(得分:1)

假设文件在第一列上以数字方式排序,您可以通过以下方式使用awk

awk 'NR==1 {max=$1} {if($1==max){print $0}}'

这会抓取第一行的第一个字段并将其存储在变量max中,并且随后仅打印与此数字匹配的行

答案 1 :(得分:1)

你问过如何在bash中执行此操作。我不得不说awk可以提供最清晰的方法来实现你想要的东西:

awk 'NR==1{n=$1} $1==n{print;next} {exit}'

这将从第一个字段获取计数,然后使用第一个字段打印每一行,并在字段不匹配时退出。它假定排序输入。

但是,任务仍可以单独使用bash(甚至只是shell)处理,而不会产生额外的命令或子shell。

#!/bin/sh

n=0
while read count data; do
  printf "%3d %s\n" "$count" "$data"
  if [ $n -gt 1 -a "$count" != "$lastcount" ]; then
    break
  fi
  n=$((n+1))
done

有几种方法可以实现这一目标。

答案 2 :(得分:0)

您可以首先检索最大出现次数,然后在该文件上进行grep:

NB=$(head -n1 error.dat | cut -d ' ' -f 1)
egrep ^$NB error.dat

此处egrep表示grep应将模式解释为正则表达式;并且^代表一行的开头

答案 3 :(得分:0)

您可以使用此awk

awk 'NR==FNR{if ($1>max) max=$1; next} $1==max' file file
19 prob561493
19 prob564972
19 prob561564

在第一遍中,我们从变量$1中存储的max获取最大值,在第二遍中,我们只打印所有第一个字段与max相同的记录。

答案 4 :(得分:0)

使用awk提取'19'和grep + regex以获取以19\b开头的行。假设您的文件名是“输出”:

grep -E "$(head -n1 output | awk '{print $1}')\b" output