我有一个文件,它有几行重复的内容,只是在第一列中有所不同。
原始档案:
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列中的值相加。
期望产出:
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这个脚本非常接近我想要做的事情:
awk '{a[$2]+=$1}END{for(i in a)print a[i] , i |"sort"}' file给出这个输出:
5 A
0 B
11 C
4 D 是否有方法将$2更改为除此脚本中的第一个列之外的所有列?
发布于 2022-11-17 09:58:13
这样做是可行的,但不能保持行的顺序:
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对第二列进行排序。
输出:
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发布于 2022-11-17 16:37:03
使用datamash和awk:
因为重复行仅在第一列中不同,所以这个datamash命令可以工作。
$ datamash -s -t' ' groupby 2 sum 1 --full 发布于 2022-11-18 19:22:28
每次只在内存中存储1行,并使用任何awk在输出中再现输入顺序:
$ 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
}$ 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 '...'。
https://unix.stackexchange.com/questions/725262
复制相似问题