使用 awk 根据另一列的值对一列的值求和

使用 awk 根据另一列的值对一列的值求和

我正在尝试使用 来对列中的某些数字求和awk。我想仅对“smiths”的第 3 列求和,得到总计 212。我可以使用awk但不仅仅是“smiths”对整个列求和。我有:

awk 'BEGIN {FS = "|"} ; {sum+=$3} END {print sum}' filename.txt

我也在用腻子。感谢您的任何帮助。

smiths|Login|2
olivert|Login|10
denniss|Payroll|100
smiths|Time|200
smiths|Logout|10

答案1

awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • flag-F设置字段分隔符;我把它放在单引号中,因为它是一个特殊的 shell 字符。
  • 然后$1 ~ /smiths/将以下 {code block} 仅应用于第一个字段与 regex 匹配的行/smiths/
  • 其余的与您的代码相同。

请注意,由于您在这里并未真正使用正则表达式,而只是使用特定值,因此您可以轻松使用:

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

它检查字符串相等性。这相当于使用 regex /^smiths$/,如另一个答案中所述,其中包括^仅匹配字符串开头(字段 1 的开头)的锚点和$仅匹配字符串结尾的锚点。不确定您对正则表达式有多熟悉。它们非常强大,但对于这种情况,您可以同样轻松地使用字符串相等性检查。

答案2

另一种方法是使用 awk 关联数组,更多信息这里。该行产生所需的输出:

awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt

作为副作用,该数组存储所有其他值:

awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt

输出:

smiths 212
denniss 100
olivert 10

答案3

到目前为止非常好。您需要做的就是在块之前添加一个选择器来添加总和。这里我们检查第一个参数是否仅包含“smiths”:

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

您可以通过指定字段分隔符作为选项来缩短此过程。awk通常,在命令行上初始化变量是一个好主意:

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'

答案4

cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
  • -F指定分隔符的选项。
  • $NF用于“最后一列”。

相关内容