Linux awk减去不同的列

Linux awk减去不同的列,linux,awk,Linux,Awk,我想对重复的行进行分组,并从这些行中减去COL中的值。你知道我该怎么做吗 例如: dbstat 100 90 80 60 1000 dbstat 10 10 10 20 test 5 5 output should be: dbstat 90 80 70 40 1000 test 5 5 更新: 对于其他文件,我必须对匹配行的值求和,这可以使用: awk'{for(i=2;i如果它不必是awk,这个perl脚本将为示例输入提供所需的输出: !/usr/bin/perl 使用警告; 严格

我想对重复的行进行分组,并从这些行中减去COL中的值。你知道我该怎么做吗

例如:

dbstat 100 90 80 60 1000 
dbstat 10 10 10 20 
test 5 5
output should be: 
dbstat 90 80 70 40 1000 
test 5 5
更新: 对于其他文件,我必须对匹配行的值求和,这可以使用:


awk'{for(i=2;i如果它不必是awk,这个perl脚本将为示例输入提供所需的输出:

!/usr/bin/perl
使用警告;
严格使用;
使用功能qw/say/;
使用List::MoreUtils qw/pairwise/##Non-core;通过操作系统或CPAN安装。
我的%记录;
而(){
我的($key,@cols)=拆分/\s+/;
$records{$key}=
[成对{defined$a?$a-($b//0):$b}@{$records{$key}},@cols];
}
foreach my$key(对关键字%记录进行排序){
说“$key@{$records{$key}}”;
}
它以排序的顺序生成输出,就像您的示例一样。如果行应该按照它们在实际输入中第一次出现的顺序,这也是可行的。从您的示例中看不清楚,因为这是从排序开始的

它也不要求副本是连续的-这很重要吗?

$cat文件
$ cat file
test1 100 20 25 30
test1 10 10
test1 30 0 2
test2 500
test2 100 50 90
test2 10 0
test3 100 100 100
$
$ cat tst.awk
p != $1 {
    for (i in c)
        p = p OFS c[i]
    if (p)
        print p
    p = $1
    delete c
    for (i = 2; i <= NF; ++i)
        c[i] = $i
    next
}
{
    for (i = 2; i <= NF; ++i)
        c[i] -= $i
}
END {
    for (i in c)
        p = p OFS c[i]
    print p
}
$
$ awk -f tst.awk file
test1 60 10 23 30
test2 390 -50 -90
test3 100 100 100
测试1100 20 25 30 测试11010 测试13002 测试2500 测试2 100 50 90 测试2 10 0 测试31000 $ $cat tst.awk p!=1美元{ (c中的i) p=p of S c[i] 如果(p) 打印p p=1美元 删除c
对于(i=2;i)您必须向我们展示预期输出的样本以及您在代码标记方面的努力,请这样做,然后让我们知道。请编辑您的Q以显示您解决问题的最佳尝试。同时请澄清:规则是“始终从该记录的第一个实例中减去任何
dbstat
记录值”?如果/可以有2条记录为负值,即
-10-10 10 20
,如果是,结果会是什么?祝你好运。
$ cat file2
test2 500
test1 100 20 25 30
test2 100 50 90
test1 30 0 2
test2 10 0
test3 100 100 100
test1 10 10
$
$ cat tst2.awk
{
    f = ($1 in a)
    for (i = 2; i <= NF; ++i)
        a[$1][i] -= (f ? $i : -$i)
}
END {
    for (k in a) {
        o = k
        for (i in a[k])
            o = o OFS a[k][i]
        print o
    }
}
$
$ awk -f tst2.awk file2
test1 60 10 23 30
test2 390 -50 -90
test3 100 100 100