我正在尝试使用 来对列中的某些数字求和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
用于“最后一列”。