shell - 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 做到这一点,但由于某种原因,我真的很挣扎。
解决方案
(类似于 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 中处理具有不同字段分隔符的两个文件
推荐阅读
- python - 忽略 Vigenere Cipher 中的空格
- flutter - Flutter - 定时器意外暂停
- angular - 增加模态的大小
- ios - 滚动类型为水平时的UICollectionview拖放问题
- javascript - 仅当省略号处于活动状态时才显示工具提示
- maven - 上传到 Nexus 的自定义 JAR 未从 settings.xml 中定义的 Nexus 公共组解析
- c# - 如何从 ASP.Net 核心 API 共享上传的文件
- php - 注册为服务的 Symfony 3.4 控制器抛出弃用警告
- python - 在字符串前打印 10 个字符
- java - 我如何确保添加到数组的对象的 ID 不存在而不会出现 nullpointerexception?