You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:25:46