For loop 为每个部分计算数字实例的AWK脚本

For loop 为每个部分计算数字实例的AWK脚本,for-loop,awk,while-loop,For Loop,Awk,While Loop,也许对于我正在尝试使用的任务来说,AWK不是最好的编码语言。我熟悉Python,但我只是喜欢在这样的情况下使用AWK。这是我的编码问题。我有一个文件如下所示: name1 0 name1 1 name1 0 name1 1 name2 0 name2 0 name3 1 name3 1 name3 1 name3 0 我试图计算每个不同名称的0和1的数量(它们增加到3000个左右)。例如,我想在一个新文件中打印以下内容 name1 2 2 #There are 2 ones and 2

也许对于我正在尝试使用的任务来说,AWK不是最好的编码语言。我熟悉Python,但我只是喜欢在这样的情况下使用AWK。这是我的编码问题。我有一个文件如下所示:

name1 0
name1 1
name1 0
name1 1
name2 0
name2 0
name3 1
name3 1
name3 1
name3 0
我试图计算每个不同名称的0和1的数量(它们增加到3000个左右)。例如,我想在一个新文件中打印以下内容

name1 2 2    #There are 2 ones and 2 zeros
name2 0 2    #There are 0 ones, and 2 zeros
name3 1 3    #There are 1 one, and 3 zeros
计算0和1是显而易见的,我将使用一个简单的if/else语句

awk '{
if (variable == false)
    while (
if ($2 == 0)
    a++;
else
    b++;
}' 

我该如何确保每个名字都是我数数的

您应该尝试使用
awk
数组:

awk '{
m[$1,$2]++;a[$1]
}
END{
for(i in a) 
   print i, (m[i,"1"] ? m[i,"1"] : "0") , (m[i,"0"] ? m[i,"0"] : 0) 
}'  names
  • 第一个数组
    m
    用于保存字段+编号并在以后使用
  • 第二个是数组
    a
    是为了记住第一个字段
  • (m[i“1”]?m[i“1”]:“0”),(m[i“0”]?m[i“0”]:0)
    是三元运算符,用于在
    m
    中没有任何内容的情况下使用

如果您的输入按照示例中的顺序进行排序,则使用任何awk:

$ awk '
    NR>1 && $1!=prev { print prev, cnt[1]+0, cnt[0]+0; delete cnt }
    { cnt[$2]++; prev=$1 }
    END { print prev, cnt[1]+0, cnt[0]+0 }
' file
name1 2 2
name2 0 2
name3 3 1
$ awk '
    { cnt[$1,$2]++; keys[$1] }
    END { for (key in keys) print key, cnt[key,1]+0, cnt[key,0]+0 }
' file
name1 2 2
name2 0 2
name3 3 1
否则,如果输入未排序,则使用GNU awk进行真正的多维数组:

$ awk '
    { cnt[$1][$2]++ }
    END{ for (key in cnt) print key, cnt[key][1]+0, cnt[key][0]+0 }
' file
name1 2 2
name2 0 2
name3 3 1
或使用任何awk:

$ awk '
    NR>1 && $1!=prev { print prev, cnt[1]+0, cnt[0]+0; delete cnt }
    { cnt[$2]++; prev=$1 }
    END { print prev, cnt[1]+0, cnt[0]+0 }
' file
name1 2 2
name2 0 2
name3 3 1
$ awk '
    { cnt[$1,$2]++; keys[$1] }
    END { for (key in keys) print key, cnt[key,1]+0, cnt[key,0]+0 }
' file
name1 2 2
name2 0 2
name3 3 1

有一种简单的方法可以做到这一点,只需使用并行关联数组,如下所示:

    $2 == 0 { zero[$1] += 1; one[$1] += 0 }
    $2 == 1 { zero[$1] += 0; one[$1] += 1 }
    END { for (key in zero) { print key" "one[key]" "zero[key] } }
这将忽略所有没有零或一作为第二个字段的行,并正确更新并行数组(即,将适当的值添加到两个数组中),以便于后期处理


后处理仅涉及迭代其中一个数组的键并从这两个数组中打印出值。上一段中提到的正确更新确保每个键都在两个数组中。

当我运行此操作时,它似乎没有正确计数,因为我只看到0 1,而不是为每个名字所看到的0和1s的实际数目。当我用你的例子运行它时,我得到了:<代码> NAME1,2,2,NAME2,0,2,NAME3,3,1,< /代码>我的错误(我用的是一个只有一个唯一名字的文本文件,所以当然它没有计算任何东西。谢谢!!如果答案对你有用,请考虑如下: