UNIX下如何快速查询文件某字段不在另一文件值列表的无效值
高效实现方案
优先推荐awk方案,仅需遍历两个文件各一次,内存仅存储合法货币码哈希表(合法货币码数量通常仅数百个,内存占用可忽略),百万级交易数据可在秒级完成计算。
1. 输出所有含无效货币码的完整交易记录
awk -F '|' 'NR==FNR {valid[$1]=1; next} FNR==1 {next} !valid[$3]' File2 File1
参数说明:
-F '|':指定字段分隔符为|NR==FNR {valid[$1]=1; next}:处理第一个输入文件File2时,将所有合法货币码存入valid哈希表FNR==1 {next}:跳过File1的表头行!valid[$3]:匹配curr_cd不在合法列表中的行,直接输出
2. 仅输出去重后的无效货币码列表
如果不需要对应交易记录,仅需要统计所有出现过的无效货币码,使用以下命令:
awk -F '|' 'NR==FNR {valid[$1]=1; next} FNR==1 {next} !valid[$3] && !dup[$3]++ {print $3}' File2 File1
可选优化:忽略大小写匹配
如果两个文件的货币码存在大小写格式不一致的问题,可转为统一大小写后判断:
awk -F '|' 'NR==FNR {valid[tolower($1)]=1; next} FNR==1 {next} !valid[tolower($3)]' File2 File1
方案优势说明
类似join的其他命令需要先对两个文件排序,百万级交易数据排序会产生大量IO开销,执行效率远低于上述awk方案。
内容的提问来源于stack exchange,提问作者Jyoti Singh
相关产品推荐
相关产品推荐

