unix正则表达式,用于在文件中添加内容

时间:2009-05-10 05:29:13

标签: regex unix command

我在文件中有内容

喜欢

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

我想编写一个unix命令,该命令应该能够添加1 + 2 + 3并将结果显示为6

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

4 个答案:

答案 0 :(得分:4)

我相信您正在寻找以下内容。它将总结每个记录中从stdin读取的数据的最后一个字段。

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

有些注意事项:

  1. 使用awk,您不需要声明变量,通过为它们赋值来使它们成为现实。
  2. 变量NF是当前记录中的字段数。通过在$前加上我们将其值视为变量。至少这是它看起来如何工作:)
  3. END { }块只有在其他块处理完所有记录后才会生成。

答案 1 :(得分: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事物)更改行为。

答案 2 :(得分:0)

这可能不是你想要的,但我写了一个快速的Ruby脚本来实现你的目标:

#!/usr/bin/env ruby

total = 0
while gets
    total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total

答案 3 :(得分:0)

这是Perl中的一个。

$ cat foo.txt
asdfb ... 1
adfsdf ... 2
sdfdf ..   3

$ perl -a -n -E '$total += $F[2]; END { say $total }' foo
6

Golfed版本:

perl -anE'END{say$n}$n+=$F[2]' foo
6