linux - Awk:如何跨列计算字符串的出现次数并找到跨行的最大值?

标签 linux bash awk

我在 Linux 上的 bash 脚本有问题。

我的输入是这样的:

  input
    Karydhs     y n y y y n n y n n n y n y n 

    Markopoulos y y n n n y n y n y y n n n y

    name3       y n y n n n n n y y n y n y n

等...

which y=yes and n=no 那是投票的结果......现在我想用 awk 显示每个人的名字和总的赞成票(名字)以及获胜者(获得最多 y),有什么想法吗?

我是这样做的:

awk '{count=0 for (I=1;i<=15;i++) if (a[I]="y") count++} {print $1,count}' filename

最佳答案

这是一个快速的(不需要排序,没有显式的“for”循环),考虑到连接可能性的一次性解决方案:

awk 'NF==0{next} 
  {name=$1; $1=""; gsub(/[^y]/,"",$0); l=length($0); 
   print name, l;
   if (mx=="" || mx < l) { mx=l; tie=""; winner=name; }
   else if (mx == l) {
          tie = 1; winner = winner", "name;
        }
  }
  END {fmt = tie ? "The winners have won %d votes each:\n" :
                   "The winner has won %d votes:\n";
       printf fmt, mx;
       print winner;
  }'

输出:

Karydhs 7
Markopoulos 7
name3 6
The winners have won 7 votes each:
Karydhs, Markopoulos

注意:上面的程序是为了可读性而提供的,但接受 GNU awk 显示的换行符。某些 awk 不允许拆分三元条件。

关于linux - Awk:如何跨列计算字符串的出现次数并找到跨行的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34866683/

相关文章:

awk - Linux awk 命令

string - 在bash中提取两个字符之间的字符串

linux - 有没有办法限制进程在启动时消耗的内存

linux - 我想在 linux 上删除多行文本

linux - grep 每行中的一个模式

linux - 如果内容包含字符串,则在两个定界符之间打印文本 block

linux - 在启动时启动受限制的 Node.js 应用程序

linux - 如何在另一个 linux 终端中结束一个进程

linux - perl $ENV 没有得到 linux bash var 的值

linux - 如何删除字符串开始前和结束后的空格