AWK脚本,用于为每个部分计算数字实例

时间:2018-08-27 01:41:45

标签: 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 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++;
}' 

我将如何确保要为每个名称计数?

3 个答案:

答案 0 :(得分:1)

您应该尝试使用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中没有内容的情况下使用。

答案 1 :(得分:0)

如果您的输入按照示例进行排序,则使用任何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

否则,如果输入未排序,则使用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 '
    { 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)

有一个简单的方法,只需使用并行关联数组,如下所示:

    $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] } }

这将忽略不包含零或一作为第二字段的所有所有行,并正确更新并行数组(即,将适当的值添加到两个数组)以简化后处理

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