按不同文件中的公共字符串求和

按不同文件中的公共字符串求和

我有一个文件file1,其中包含用户在文件中出现的次数,如下所示:

4 userC
2 userA
1 userB

我还有另一个file2包含用户和其他信息的文件,例如:

userC, degree2
userA, degree1
userB, degree2

我想要一个输出,其中显示每个级别用户出现的次数:

5 degree2
2 degree1

答案1

纯的awk

$ awk -F'[, ]' 'NR==FNR{n[$2]=$1;next}{m[$3]+=n[$1]}
    END{for(i in m){print i " " m[i]}}' \
    file1 file2
degree1 2
degree2 5

或者您可以将其放入这样的脚本中:

#!/usr/bin/awk -f 
BEGIN {
    FS="[, ]"
}
{
    if (NR == FNR) {
        n[$2] = $1;
        next;
    } else {
        m[$3] += n[$1];
    }
}
END {
    for (i in m) {
        print i " " m[i];
    }
}

首先将字段分隔符设置为逗号和空格(即BEGIN块或-F命令行选项)。

然后,在解析第一个文件(FNR == NR习惯用法)时,将用户的连接数放入按用户名索引的数组中。解析以下文件时,将每个用户的连接数添加到按用户组索引的数组中。

最后(END块)扫描整个数组并打印键、值对。

相关内容