簡體   English   中英

Awk:為每行計數帶有模式的字段

[英]Awk: Counting fields with a pattern for each line

僅僅因為它的厚臉皮的性質,這讓我感到非常頭疼。

我有一個大約15行的文件(名為“ votes”)。 對於每一行,第一個字段具有候選人的姓名,接下來的15個字段具有15個投票,如下所示:

McBoatface y y n y n y y y n n n y n y
McDoodle n n n n n n n n n n n n n n n
Putin y n y n y y n n n n n n n y y
TheLegend27 y y y y y y y y y y y y y y y

y是,n是否

我編寫了一個awk腳本,該腳本計算每個候選人的“ y”數,並用他/她的名字打印出來:

McBoatface 8
McDoodle 0
Putin 6
TheLegend27 15

這是我的嘗試:

{
        count=0;

        for(i=$2; i<NF; i++)
        {
             if ($i == "y") count++;
        }
        printf("%s %d \n" $1, count);
}

但這只會在名稱后顯示零:

McBoatface 0
McDoodle 0
Putin 0
TheLegend27 0

這是怎么回事? i<NF表達式錯誤嗎?

另一種方法是在名稱( $1 )之后計算y ,如下所示:

$ awk '{ i=$1; $1=""; print i, gsub(/y/,"") }' file
McBoatface 8
McDoodle 0
Putin 6
TheLegend27 15

解釋:

{
    i=$1;                  # place name to var i
    $1="";                 # empty name field
    print i, gsub(/y/,"")  # print name and count of all y's
} 

您想要for(i=2; ...而不是for(i=$2; ...這是怎么回事,$ 2在任何情況下都不能小於NF,所以您永遠不要進入您的for循環。

而且,您還希望i<=NF而不是< ,以確保您獲得最后的選票。

$ cat votes.awk
{
    count=0;
    for(i=2; i<=NF; i++) {
      if ($i == "y") count++;
    }
    print $1, count
}

$ awk -f votes.awk votes.txt 
McBoatface 8
McDoodle 0
Putin 6
TheLegend27 15

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM