在linux命令行上做数学运算

Tak*_*Tak 0 bash awk

我有一个来自Web服务器的日志文件,看起来像这样;

1908 462
232 538
232 520
232 517
Run Code Online (Sandbox Code Playgroud)

我的任务是在bash脚本中总计第1列和第2列.我想要的输出是;

2604 2037
Run Code Online (Sandbox Code Playgroud)

我知道awk或者sed哪个方面可以解决我的问题,但我无法理解如何实际解决问题.我在谷歌上搜索了一些例子,但没有发现任何有用的东西.有人能指出我正确的方向吗?

Kei*_*son 6

awk '{a += $1; b += $2} END { print a " " b }' foo.log
Run Code Online (Sandbox Code Playgroud)

(注意完全没有错误检查.)

编辑:

好的,这是一个错误检查的版本:

awk 'BEGIN { ok = 1 } { if (/^ *[0-9]+ +[0-9]+ *$/) { a += $1; b += $2 } else { ok = 0; exit 1 } } END { if (ok) print a, b }' foo.log
Run Code Online (Sandbox Code Playgroud)

如果您不想接受前导空格或尾随空格,请删除" *"if语句中的两个空格.

但这足够大,它可能不应该是一个单行:

#!/usr/bin/awk -f

BEGIN {
    ok = 1
}

{
    if (/^ *[0-9]+ +[0-9]+ *$/) {
        a += $1
        b += $2
    }
    else {
        ok = 0
        exit 1
    }
}

END {
    if (ok) print a, b
}
Run Code Online (Sandbox Code Playgroud)

仍然没有溢出或下溢检查,它假定没有迹象.后者很容易修复; 前者会更难.(注意awk在内部使用浮点;如果总和足够大,它可能会悄然失去精度.)