awk:我可以找到给定字符串中 char 的出现次数吗?

awk:我可以找到给定字符串中 char 的出现次数吗?

有什么方法可以得到以下结果吗?

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
  1. 我们用来tr将空格转换为换行符,然后
  2. 用于sort按字母顺序对数据(现在是一系列行)进行排序,然后
  3. 用于uniq计算每个有多少个,最后
  4. 再次使用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

如果必须是awkfile包含“字符串”):

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

相关内容