Linux 数组的awk键值问题

Linux 数组的awk键值问题,linux,shell,awk,Linux,Shell,Awk,我遇到一个awk阵列问题,详情如下: [~/temp]$ cat test.txt 1 2 3 4 1 2 3 然后我想数一数这个数字的频率 [~/temp]$ awk 'num[$1]++;END{for (i in num){printf("%s\t%-s\n", num[i],i)|"sort -r -n -k1"} }' test.txt 1 2 3 2 3 2 2 2 1 1 4 如您所见,为什么前3行“1 2 3”的输出值将为空值

我遇到一个awk阵列问题,详情如下:

[~/temp]$ cat test.txt
1
2
3
4
1
2
3
然后我想数一数这个数字的频率

[~/temp]$ awk 'num[$1]++;END{for (i in num){printf("%s\t%-s\n", num[i],i)|"sort -r -n -k1"} }' test.txt
1
2
3
2       3
2       2
2       1
1       4
如您所见,为什么前3行“1 2 3”的输出值将为空值

谢谢你的回答。

把你的每行部分放在{}中,即{num[$1]+;}


awk编程一个[pattern]{actions}的集合。模式是可选的,{}不是。似乎在你的情况下,你的线路被视为模式

awk语句由模式和相关操作组成。省略的模式匹配输入的每个记录。省略的操作是{print$0}的别名,即输出当前记录,这是您得到的。查看您的计划的第一部分:

$ awk 'num[$1]++' file
1
2
3
让我们稍微改变一下,以了解那里发生了什么:

$ awk '{print "NR:",NR,"num["$1"]++:",num[$1]++}' file
NR: 1 num[1]++: 0
NR: 2 num[2]++: 0
NR: 3 num[3]++: 0
NR: 4 num[4]++: 0
NR: 5 num[1]++: 1
NR: 6 num[2]++: 1
NR: 7 num[3]++: 1
由于您在模式中使用后缀运算符num[$1]++,因此在记录1-4上,在其值递增之前,它将被求值为0。如果使用前缀运算符++num[$1],则输出会有所不同,它将首先增加变量的值,然后对其进行求值,并将导致输出每个输入记录,而不仅仅是最后三条记录

正确的方法是将num[$1]++用作操作,而不是模式:

$ awk '{num[$1]++}' file

你在谷歌上搜索过怎么做吗?是的,你是对的,但是当缺少{}时如何解释命令,我想知道更多关于{}在awk中的重要性~