如何对第二列含2个及以上匹配字符串的行分组并分配新组号
解决方案
你可以用下面的awk脚本直接完成需求,不需要额外依赖:
BEGIN { FS = ", " group_id = 0 } # 第一步:预读取所有行,保存原始内容和对应条目集合 { raw[NR] = $0 n = split($2, arr, " ") for (i=1; i<=n; i++) { item_set[NR][arr[i]] = 1 } group[NR] = 0 } # 第二步:遍历匹配分组 END { for (i=1; i<=NR; i++) { # 已分过组的直接跳过 if (group[i] != 0) continue current_group = 0 # 匹配所有和当前行交集>=2的行 for (j=1; j<=NR; j++) { if (i == j) continue # 计算两行条目的交集大小 intersect = 0 for (k in item_set[i]) { if (item_set[j][k]) intersect++ } if (intersect >= 2) { if (current_group == 0) { group_id++ current_group = group_id group[i] = current_group } if (group[j] == 0) group[j] = current_group } } } # 输出最终结果 for (i=1; i<=NR; i++) { print raw[i] (group[i] ? ", " group[i] : "") } }
使用方法
将上述代码保存为group.awk,在终端执行以下命令即可:
awk -f group.awk 你的输入文件路径
运行效果
针对你给出的示例输入,运行后输出结果如下:
1, C10 C11 N3 O1, 1 2, C19 C23 O2, 2 3, C19 N2 O2, 2 4, C10 C11 O1, 1 5, C11 N3 O1, 1 6, C13 C8 O3, 3 7, C8 N5 O3, 3
符合要求:交集条目数≥2的行会被分到同一组,且行优先归入第一个匹配到的分组。
内容的提问来源于stack exchange,提问作者Hailey
相关产品推荐
相关产品推荐

