技术需求:统计两文件对应行第二列分号分隔元素的匹配数量
我来帮你搞定这个文本元素匹配计数的需求!这里有两种实用的方案,你可以根据自己的使用环境选择:
方案一:用awk快速处理(适合Linux/Unix环境)
awk是处理文本的老牌工具,一行脚本就能完成任务,不需要额外安装依赖:
先把下面的代码保存成count_matches.awk文件:
BEGIN { FS=";" } NR==FNR { split($0, arr, / /) mir = arr[1] delete seen for (i=2; i<=NF; i++) { seen[$i] = 1 } mir_map[mir] = seen next } { split($0, arr, / /) mir = arr[1] count = 0 for (i=2; i<=NF; i++) { if ($i in mir_map[mir]) { count++ } } print mir, count }
然后在终端运行命令:
awk -f count_matches.awk File1.txt File2.txt
简单解释:
- 先设置分号为字段分隔符,方便拆分每个元素
- 第一遍读取
File1.txt,把每个mir对应的元素存入关联数组 - 第二遍读取
File2.txt,逐个检查元素是否在File1的对应mir集合里,统计匹配数量后输出
方案二:用Python脚本(跨平台,更灵活)
如果你对Python更熟悉,或者需要在Windows环境运行,这个脚本更直观,也方便后续修改扩展:
保存下面的代码为count_matches.py:
def load_mir_elements(filename): mir_dict = {} with open(filename, 'r') as f: for line in f: line = line.strip() if not line: continue # 拆分mirID和后面的元素串(处理元素里可能有空格的情况) mir_id, elements_str = line.split(' ', 1) elements = set(elements_str.split(';')) mir_dict[mir_id] = elements return mir_dict # 加载两个文件的内容 file1_data = load_mir_elements('File1.txt') file2_data = load_mir_elements('File2.txt') # 遍历统计并输出结果 for mir_id in file2_data: if mir_id in file1_data: # 求两个集合的交集,长度就是匹配数 common_elements = file1_data[mir_id] & file2_data[mir_id] print(f"{mir_id} {len(common_elements)}")
运行命令:
python count_matches.py
简单解释:
- 先把每个文件的内容转成"mirID: 元素集合"的字典,集合能快速求交集
- 遍历第二个文件的mirID,计算对应元素集合的交集长度,就是你要的匹配数
两种方法都能输出你期望的结果:
mir1 2 mir2 5
内容的提问来源于stack exchange,提问作者Emilio Mármol Sánchez
相关产品推荐
相关产品推荐

