如何用AWK减去行(行)


9

我试图弄清楚如何使用AWK减去行。例如,假设输入文件为:

30
20

输出为:

10

现在,作为测试,我试图从以下公式计算“已用”内存列:

$ cat /proc/meminfo

所以目前我已经写了这个:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    -- Here comes the calculation using AWK

我尝试了以下方法:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}' 

但这只是给我最后一行数据。

我找到了一个可行的解决方案,但我怀疑这是最佳的解决方案。我所有的编码经验都告诉我,硬编码行数非常糟糕:P

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'

您要对N行执行什么操作?最终结果应该是 line1_$2 - line2_$2 - lineN-$2吗?您是否只想减去前两行?
terdon

Answers:


9

你也可以做到这一点使用awkpastebc。我发现这种方法更容易记住,awk始终的语法要求我仔细检查以确认。

注意:这种方法的优点是可以处理多行输出,从第1个减去第2个,第3个,第4个等数字。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | paste -sd- - | bc
7513404

细节

上面用来awk选择包含我们要减去的数字的列。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'
7969084
408432

然后paste,我们使用合并这两个值的值,并在它们之间添加减号。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- -
7969084-346660

当我们将bc其传递给它时,将执行计算。

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- - | bc
7513404

@terdon-谢谢您在进行编辑时所做的修改8
slm

3

纯awk解决方案,没有多余的cat或grep命令:

awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo

我看到awk_FTW击败了我,但我格式化输出可能不错。


3

尝试这个:

grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.