Linux awk减去不同的列
我想对重复的行进行分组,并从这些行中减去COL中的值。你知道我该怎么做吗 例如: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 使用警告; 严格
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