Linux Bash 和脚本 - 计算文本文件中的行数

Linux Bash 和脚本 - 计算文本文件中的行数

我在显示我当前正在处理的脚本中显示的行数时遇到问题,并且我正在使用 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”的变量并使用它来计数。

相关内容