我在文件中有内容
像
asdfb ... 1
adfsdf ... 2
sdfdf .. 3
我想编写一个应该能够添加 1 + 2 + 3 并给出结果为 6 的 unix 命令
据我所知,grep 和 awk 会很方便,任何指针都会有所帮助。
我相信以下是您正在寻找的。它将汇总从标准输入读取的数据的每条记录中的最后一个字段。
awk '{ sum += $NF } END { print sum }' < file.txt
需要注意的一些事项:
NF
是当前记录中的字段数。通过在它前面加上 $ 我们将它的值视为一个变量。至少这是它的工作方式:)END { }
块仅在所有记录都已被其他块处理后才出现。awk
您只需要一个脚本,因为它具有grep
作为语言的一部分内置的功能。
假设您的实际文件包括:
asdfb zz 1
adfsdf yyy 2
sdfdf xx 3
你想对第三列求和。您可以使用:
echo 'asdfb zz 1
adfsdf yyy 2
sdfdf xx 3' | awk '
BEGIN {s=0;}
{s = s + $3;}
END {print s;}'
BEGIN 子句在处理任何行之前运行,END 子句在处理所有行之后运行。
另一个子句发生在每一行,但您可以添加更多子句来根据各种事物(grep
-py 事物)更改行为。
这可能不是您正在寻找的,但我编写了一个快速的 Ruby 脚本来实现您的目标:
#!/usr/bin/env ruby
total = 0
while gets
total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total
这是 Perl 中的一个。
$ cat foo.txt
asdfb ... 1
adfsdf ... 2
sdfdf .. 3
$ perl -a -n -E '$total += $F[2]; END { say $total }' foo
6
打高尔夫球的版本:
perl -anE'END{say$n}$n+=$F[2]' foo
6