我在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
先获取输出的整数,然后只显示唯一的结果,但返回了所有重复的结果。
如何只打印重复的最大重复行?
答案 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