首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据行的其余部分用awk求和第一列中的值

根据行的其余部分用awk求和第一列中的值
EN

Unix & Linux用户
提问于 2022-11-17 09:48:46
回答 3查看 107关注 0票数 1

我有一个文件,它有几行重复的内容,只是在第一列中有所不同。

原始档案:

代码语言:javascript
复制
2 A 3 rr 44 5 t y uuu 8
3 A 3 rr 44 5 t y uuu 8
0 B f 1
1 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
5 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
5 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
3 D tt v 44 f1 p
1 D tt v 44 f1 p

我想要的是去掉重复值,并将第1列中的值相加。

期望产出:

代码语言:javascript
复制
5 A 3 rr 44 5 t y uuu 8
0 B f 1
11 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5  4 t rr 33
4 D tt v 44 f1 p

这个脚本非常接近我想要做的事情:

代码语言:javascript
复制
awk  '{a[$2]+=$1}END{for(i in a)print a[i] , i |"sort"}' file

给出这个输出:

代码语言:javascript
复制
5 A 
0 B 
11 C 
4 D 

是否有方法将$2更改为除此脚本中的第一个列之外的所有列?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2022-11-17 09:58:13

这样做是可行的,但不能保持行的顺序:

代码语言:javascript
复制
awk '{v=$1; $1=""; s[$0]=s[$0]+v} END {for (r in s) { printf "%s%s\n",s[r],r }}' file
  • 将第一个字段保存在变量中,然后将其清空。
  • 以行(使用空的$1)作为键保存数组,并将保存的$1之和作为其值。
  • 最后,打印数组。我使用printf来避免额外的空间,因为我们不能删除,而只能删除空的$1

添加| sort -k2对第二列进行排序。

输出:

代码语言:javascript
复制
5 A 3 rr 44 5 t y uuu 8
0 B f 1
11 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5 4 t rr 33
4 D tt v 44 f1 p
票数 0
EN

Unix & Linux用户

发布于 2022-11-17 16:37:03

使用datamashawk

因为重复行仅在第一列中不同,所以这个datamash命令可以工作。

代码语言:javascript
复制
$ datamash -s -t' ' groupby 2 sum 1 --full 
票数 0
EN

Unix & Linux用户

发布于 2022-11-18 19:22:28

每次只在内存中存储1行,并使用任何awk在输出中再现输入顺序:

代码语言:javascript
复制
$ cat tst.awk
{
    currKey = $0
    sub(/[^[:space:]]+ /,"",currKey)
}
currKey != prevKey {
    if ( NR > 1 ) {
        print prev0
    }
    prevKey = currKey
    prev1 = 0
}
{
    $1 += prev1
    prev1 = $1
    prev0 = $0
}
END {
    print prev0
}
代码语言:javascript
复制
$ awk -f tst.awk file
5 A 3 rr 44 5 t y uuu 8
0 B f 1
11 C 6 5 55 yy 7 4 3 4-5 tt efvho 44 3 5 gg 5 4 t rr 33
4 D tt v 44 f1 p

以上假设您的重复行分组在一起。如果不只是运行sort -k2 file | awk '...'

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/725262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档