1

我在文件中有内容

asdfb ... 1
adfsdf ... 2
sdfdf ..   3

我想编写一个应该能够添加 1 + 2 + 3 并给出结果为 6 的 unix 命令

据我所知,grep 和 awk 会很方便,任何指针都会有所帮助。

4

4 回答 4

4

我相信以下是您正在寻找的。它将汇总从标准输入读取的数据的每条记录中的最后一个字段。

awk '{ sum += $NF } END { print sum }' < file.txt

需要注意的一些事项:

  1. 使用 awk 你不需要声明变量,它们是通过为它们赋值来实现的。
  2. 变量NF是当前记录中的字段数。通过在它前面加上 $ 我们将它的值视为一个变量。至少这是它的工作方式:)
  3. END { }块仅在所有记录都已被其他块处理后才出现。
于 2009-05-10T05:40:34.573 回答
1

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 事物)更改行为。

于 2009-05-10T05:36:10.153 回答
0

这可能不是您正在寻找的,但我编写了一个快速的 Ruby 脚本来实现您的目标:

#!/usr/bin/env ruby

total = 0
while gets
    total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total
于 2009-05-10T05:35:56.287 回答
0

这是 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
于 2009-05-10T05:49:18.937 回答