首页 > 解决方案 > awk - 计算每个唯一值并匹配 2 个文件之间的值

问题描述

我有两个文件。我正在尝试获取文件 1 中第 8 列中每个唯一字段的计数,然后匹配第二个文件第 6 列中的唯一字段值。

所以本质上,我试图 -> 从 File1 的第 8 列中获取每个唯一值和值计数,如果在 file2 的第 6 列中有匹配项

文件1:

2020-12-23 23:59:12,235911688,\N,34,20201223233739,797495497,404,819,\N,
2020-12-23 23:59:12,235911419,\N,34,265105814,718185263,200,819,\N,
2020-12-23 23:59:12,235912029,\N,34,20201223233739,748362773,404,819,\N,
2020-12-23 23:59:12,235911839,\N,34,20201223233738,745662697,404,400,\N,
2020-12-23 23:59:12,235911839,\N,34,20201223233738,745662697,404,400,\N,
2020-12-24 23:59:12,235911839,\N,34,20201223233738,745662697,404,400,\N,

文件2:

public static String status_code                             =   "819";
public static String DeActivate                                  = "400";

预期输出:

total count of status_code,819 : 3
total count of DeActivate,400 : 3

我的代码:

awk 'NR==FNR{a[$8]++}NR!=FNR{gsub(/"/,"",$6);b[$6]=$0}END{for( i in b){printf "Total count of %s,%d : %d\n",gensub(/^([^ ]+).*/,"\\1","1",b[i]),i,a[i]}}' File1 File2

算法

1.从第一个文件中取出第8个字段:(例如:819)

2.计算文件中唯一字段(819)发生的时间(基于日期)

3 从file2的第4个字段中取819对应的值

4 一起打印输出

我相信我应该能够用 awk 做到这一点,但由于某种原因,我真的很挣扎。

标签: shellawk

解决方案


(类似于 SQL JOINing 两个关系数据库表,File1 的 $8 等于 File2 的 $6。)

awk '
NR==FNR {    # For the first file
    a[$8]++; # count each $8
}
NF&&NR!=FNR {             # For non empty lines of file 2
    gsub(/[^0-9]/,"",$6); # remove non-digits from $6
    b[$6]=$4              # save name of constant to b
}
END{
    for(i in b){   # for constants occurring in File2
        if(a[i]) { # if File1 had non zero count
            printf( "Total count of %s,%d : %d\n",b[i],i,a[i]);
                   #print data
        }
    }
}' "FS=," File1 FS=" " File2

上面的代码适用于您的示例输入。它产生以下输出:

Total count of DeActivate,400 : 3
Total count of status_code,819 : 3

我认为主要问题是您没有将逗号指定为File1. 请参阅在 awk 中处理具有不同字段分隔符的两个文件


推荐阅读