我在显示我当前正在处理的脚本中显示的行数时遇到问题,并且我正在使用 Putty。该脚本读取一个类似于以下内容的文本文件
user1|login|1
user2|login|1
user1|testing tests|10
user1|voiding tests|10
user2|logout|1
user1|logout|1
目前我的 awk 看起来像
awk -F '|' '$1 == "user1" {sum += $3} END {print "user has run " NF "
processes for a total of " sum " minutes" }' textfile
目前,这为我提供了“user1 已运行 3 个进程总共 22 分钟”
如果我的数学正确的话,我需要它来正确计算行数,应该是四行。
答案1
NF是“字段数”,即列数。在本例中,每行有 3 列,因此无论匹配数有多少,输出始终为 3。您需要对遇到的每场比赛进行额外计数,proc
如下所示。
$ awk -F '|' '$1 == "user1" {proc += 1; sum += $3} END {print "user has run " proc " processes for a total of " sum " minutes" }' textfile
user has run 4 processes for a total of 22 minutes
答案2
对于给定的示例,请尝试:
仅针对一位用户:
awk -F'|' '$1=="user1"{i=$1;u[$1]++;m[$1]+=$3};END{print i,"processes:",u[i],"minutes:",m[i]}' file1
user1 processes: 4 minutes: 22
对于所有用户:
awk -F'|' '++u[$1]{m[$1]+=$3};END{for (i in u) print i,"processes:",u[i],"minutes:",m[i]}' file1
user1 processes: 4 minutes: 22
user2 processes: 2 minutes: 2
答案3
问题在于 NF 不是匹配的行数,而是字段(列)数。例如,您可以定义另一个类似于“sum”的变量并使用它来计数。