求助:使用awk实现跨文件ID匹配计数统计
使用awk解决ID匹配计数问题
核心思路
把File1中的所有ID1存入哈希数组(单次查找效率为O(1)),然后遍历File2的每一行,拆分ID1_collection的元素,逐一检查是否在哈希数组中,统计匹配数量。
完整awk脚本
# 处理第一个文件(File1),构建ID1的哈希集合 NR == FNR { # 跳过表头和分隔线行 if (NR <= 2) next # 清理当前行的|和前后空格,提取纯ID1 gsub(/^[|[:space:]]+|[[:space:]]+|$/, "", $0) id_set[$0] = 1 next } # 处理第二个文件(File2) { # 输出结果表头 if (FNR == 1) { print "| ID2 | ID1_collection | count |" next } # 输出表头分隔线 if (FNR == 2) { print "| -------- | -------- | -------- |" next } # 拆分当前行的列,处理|分隔符 split($0, cols, /[|]/) # 提取并清理ID2 id2 = cols[2] gsub(/^[[:space:]]+|[[:space:]]+$/, "", id2) # 提取并清理ID1_collection collection = cols[3] gsub(/^[[:space:]]+|[[:space:]]+$/, "", collection) count = 0 # 仅当集合非空时才拆分统计 if (collection != "") { # 按逗号拆分集合元素 elem_count = split(collection, ids, /,/) for (i=1; i<=elem_count; i++) { # 清理元素前后的空格 gsub(/^[[:space:]]+|[[:space:]]+$/, "", ids[i]) # 检查是否在ID1集合中,匹配则计数+1 if (ids[i] in id_set) { count++ } } } # 按要求格式输出结果行 printf("| %s | %s | %d |\n", id2, collection, count) }
使用方法
将上述脚本保存为count_ids.awk,然后执行命令:
awk -f count_ids.awk File1.txt File2.txt
注意:File1必须放在命令参数的第一位,因为脚本通过NR == FNR判断处理第一个输入文件。
关键细节说明
- 哈希数组效率:用哈希数组存储ID1,即使File1的ID数量很大,整体处理效率也能保持稳定。
- 格式兼容性:自动清理ID和集合元素前后的空格、表格的
|分隔符,兼容带空格的ID(如" abc ")或集合(如"1 , 2 , 3")。 - 空值处理:当
ID1_collection为空时,直接返回计数0,符合需求。
内容的提问来源于stack exchange,提问作者FactOREO
相关产品推荐
相关产品推荐

