For loop 为每个部分计算数字实例的AWK脚本
也许对于我正在尝试使用的任务来说,AWK不是最好的编码语言。我熟悉Python,但我只是喜欢在这样的情况下使用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
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 '
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,< /代码>我的错误(我用的是一个只有一个唯一名字的文本文件,所以当然它没有计算任何东西。谢谢!!如果答案对你有用,请考虑如下: