有什么方法可以得到以下结果吗?
a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a
max a
2nd max c
答案1
这是这样做的:
echo "a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a"|tr " " "\n"|sort|uniq -c|sort -rn
- 我们用来
tr
将空格转换为换行符,然后 - 用于
sort
按字母顺序对数据(现在是一系列行)进行排序,然后 - 用于
uniq
计算每个有多少个,最后 - 再次使用
sort
可将出现顺序更改为降序(首先出现最多次数)。
它假设每个项目都由一个空格分隔(在您的示例中也是如此)。
答案2
尝试
echo "i u v w a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a"|
awk 'BEGIN { RS=" " ; }
{a[$1]++;}
END {
PROCINFO["sorted_in"] = "@val_num_desc" ;
asorti(a,b) ;
i = 1 ;
for (aa in a ) {
printf "%d : %s =%d\n",i++,aa,a[aa] ;
if ( i == 3 ) exit ;} }'
(可以单行)
在哪里
BEGIN { RS=" " ; }
设置字段分隔符PROCINFO["sorted_in"] = "@val_num_desc" ;
根据数组的值排序
您可以在排序之前添加 for (aa in a ) printf "a[%s]=%d\n",aa,a[aa] ;
beforePROCINFO
以查看实际的数组顺序。
答案3
我很想在这里获取红宝石:
echo "a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a" |
ruby -e '
max = STDIN.gets # read the line
.split # split on whitespace
.group_by {|elem| elem} # create a hash grouping the words
.to_a # convert has to array of [key,value] pairs
.map {|key, val| [key, val.length]} # convert to array of [key, count] pairs
.sort_by {|key, count| count} # sort numerically
.reverse # in descending order
puts "max: " + max[0][0]
puts "2nd max: " + max[1][0]
'
答案4
如果必须是awk
(file
包含“字符串”):
awk 'BEGIN{RS=" "} {a[$1]++} END{for(i in a){if(a[i]>m){m=a[i];f=i}else
if(a[i]>n){n=a[i];s=i}}print "max:",f,"\n2nd max:",s}' file
BEGIN{RS=" "}
将 的行分隔符设置为awk
空格。a[$1]++
a
使用索引值和出现次数作为值填充数组。END{...}
处理完所有行后执行 END 块。for(i in a)
循环遍历数组a
。if(a[i]>m)
如果该值大于m
那么...m=a[i];f=i
m
设置为该值和f
字符串。这样我们就可以找到最大值else if(a[i]>n){...}
:现在我们对第二个最大值再次执行相同操作并将其保存到变量中s
。
print ...
最后,以所需的格式打印输出。
输出:
max: a
2nd max: c