我正在尝试对第2列中的某些数字求和,它与我的代码兼容。但是我也想计算在第2列中相同值重复多少次并在最后一栏中打印。
文件1
36 2605 1 2
36 2605 1 2
36 2603 1 2
36 2605 1 2
36 2605 1 2
36 2605 1 2
36 2606 1 2
Run Code Online (Sandbox Code Playgroud)
期望的输出
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1
Run Code Online (Sandbox Code Playgroud)
我试过了
awk '{a[$2]+=$1}{b[$2]+=$3}{c[$2]+=$4;count[$2]+=$2}END{for(i in a)print i,a[i],b[i],c[i],count[i]}' file1
Run Code Online (Sandbox Code Playgroud)
提前致谢
重命名了vars并添加了漂亮的打印效果:
awk '
{
sum1[$2]+=$1
sum3[$2]+=$3
sum4[$2]+=$4
count[$2]++
len2=((l=length($2))>len2?l:len2)
len1=((l=length(sum1[$2]))>len1?l:len1)
len3=((l=length(sum3[$2]))>len3?l:len3)
len4=((l=length(sum4[$2]))>len4?l:len4)
len5=((l=length(sum5[$2]))>len5?l:len5)
}
END {
for(i in count) {
printf "%*d %*d %*d %*d %*d\n",
len2,i,len1,sum1[i],len3,sum3[i],len4,sum4[i],len5,count[i]
}
}' file
Run Code Online (Sandbox Code Playgroud)
输出:
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1
Run Code Online (Sandbox Code Playgroud)
这些天空间字符相对便宜,你真的应该考虑为你的代码准备一些,特别是如果你想让其他人阅读它来帮助你调试它!这是您发布的代码:
awk '{a[$2]+=$1}{b[$2]+=$3}{c[$2]+=$4;count[$2]+=$2}END{for(i in a)print i,a[i],b[i],c[i],count[i]}' file1
Run Code Online (Sandbox Code Playgroud)
这是在通过代码美化程序运行之后(我使用过gawk -o):
{
a[$2] += $1
}
{
b[$2] += $3
}
{
c[$2] += $4
count[$2] += $2
}
END {
for (i in a) {
print i, a[i], b[i], c[i], count[i]
}
}
Run Code Online (Sandbox Code Playgroud)
看看如何通过添加一些空白现在更容易理解,因此如何count[$2]填充的错误非常明显?一些有意义的变量名称也总是非常有用,我听说字母数字字符现在很特别!
FWIW 这是我的做法:
$ cat tst.awk
BEGIN { keyFldNr = 2 }
{
numOutFlds = 0
for (i=1; i<=NF; i++) {
if (i != keyFldNr) {
sum[$keyFldNr,++numOutFlds] += $i
}
}
cnt[$keyFldNr]++
}
END {
for (key in cnt) {
printf "%s%s", key, OFS
for (i=1; i<=numOutFlds; i++) {
printf "%s%s", sum[key,i], OFS
}
print cnt[key]
}
}
$ awk -f tst.awk file
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1
$ awk -f tst.awk file | column -t
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1
Run Code Online (Sandbox Code Playgroud)
请注意,无论您在每一行上有多少个字段,它都会按原样工作,并且如果您需要为要计数和求和的键使用不同的字段,那么您只需更改 BEGIN 部分中 keyFldNr 的值即可2 随心所欲。