也许对于我要使用它的任务,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++;
}'
我将如何确保要为每个名称计数?
答案 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] } }
这将忽略不包含零或一作为第二字段的所有所有行,并正确更新并行数组(即,将适当的值添加到两个数组)以简化后处理
后处理仅涉及迭代数组中的一个的键并从两个数组中打印出值。上一段中提到的正确更新可确保每个键都在两个数组中。