如何统计文件中与第一列对应的第二列字符串出现次数
实现方法
输入输出示例
输入文件(input.txt)
CD196_RS15035 normal alleles CD196_RS15035 normal alleles CD196_RS15035 truncation in the allele CD196_RS15035 truncation in the allele CD196_RS15035 no stop for allele CD196_RS15035 no stop for allele CD196_RS16835 normal alleles CD196_RS16835 truncation in the allele CD196_RS16835 no stop for allele CD196_RS16835 no stop for allele
期望输出格式
CD196_RS15035 normal alleles 2 truncation in the allele 2 no stop for allele 2 CD196_RS16835 normal alleles 1 truncation in the allele 1 no stop for allele 2
方法一:使用awk命令(Linux/Unix环境)
一行命令即可完成统计与格式化输出,若需保证输出的allele类型顺序与输入中首次出现的顺序一致,使用以下命令:
awk '{key=$1; value=$0; sub(/^[^[:space:]]+[[:space:]]+/, "", value); if (!(value in count[key])) {order[key][++len[key]]=value} count[key][value]++} END {for (k in count) {printf "%s", k; for (i=1; i<=len[k]; i++) {v=order[k][i]; printf " %s %d", v, count[k][v]}; print ""}}' input.txt > output.txt
命令解释
- 提取每行第一列作为统计主键
key,提取第一列后的完整字符串作为value - 用二维数组
count[key][value]统计每个主键对应allele类型的出现次数 - 用
order[key]数组记录allele类型的首次出现顺序,保证输出顺序与输入一致 - 最后遍历所有主键,按格式拼接主键、allele类型及次数,写入输出文件
output.txt
方法二:使用Python脚本(跨平台)
创建count_alleles.py脚本,跨平台兼容,且逻辑更直观:
from collections import defaultdict # 初始化统计容器:计数字典+顺序记录字典 counts = defaultdict(lambda: defaultdict(int)) allele_order = defaultdict(list) # 读取输入文件并统计 with open('input.txt', 'r') as f: for line in f: line = line.strip() if not line: continue # 分割主键与allele类型(仅分割一次,避免allele类型含空格的情况) key, allele = line.split(maxsplit=1) counts[key][allele] += 1 # 记录allele类型的首次出现顺序 if allele not in allele_order[key]: allele_order[key].append(allele) # 写入输出文件 with open('output.txt', 'w') as f: for key in allele_order: output_items = [key] # 按顺序拼接allele类型与对应次数 for allele in allele_order[key]: output_items.extend([allele, str(counts[key][allele])]) # 按指定格式写入,每个主键后换行空一行 f.write(' '.join(output_items) + '\n\n')
使用步骤
- 将输入文本保存为
input.txt - 运行脚本:
python count_alleles.py - 结果自动保存到
output.txt
内容的提问来源于stack exchange,提问作者user14714429
相关产品推荐
相关产品推荐

