如何使用awk将重复行组转换为列?附7列示例数据说明
解析与处理你的7列基因型文本数据
首先我先把你提供的连续原始数据拆分成每行7列的清晰格式(原始数据是无换行的连续内容,拆分后才是正确的每行一条样本-基因记录):
18030 AAJ51 FTO rs9939609 C__30090620_10 A T 18030 AAJ51 CAT rs1001179 C__11468118_10 C C 18030 AAJ51 CCL2 rs1024611 C___2590362_10 G G 18030 AAJ51 TAS2R38 rs10246939 C___9506826_10 C C 20287 AAJ51 FTO rs9939609 C__30090620_10 A T 20287 AAJ51 CAT rs1001179 C__11468118_10 C C 20287 AAJ51 CCL2 rs1024611 C___2590362_10 A G 20287 AAJ51 TAS2R38 rs10246939 C___9506826_10 T T
数据结构先理清楚
先帮你明确每一列的含义,方便后续处理:
- 第1列:样本ID(比如18030、20287,是每个样本的唯一标识)
- 第2列:固定重复标识(AAJ51,所有记录都一致,可能是批次或项目标记)
- 第3列:基因名称(如FTO、CAT,每个基因对应固定的SNP位点)
- 第4列:SNP位点ID(如rs9939609,是该基因上的特定检测位点)
- 第5列:探针ID(每个SNP对应的检测探针编号,同一位点的探针固定)
- 第6-7列:基因型(样本在该SNP位点的两个等位基因,比如A/T是杂合型,C/C是纯合型)
常见处理场景的实现方法
1. 快速筛选特定样本的所有数据
如果你想提取样本20287的全部基因检测记录,用awk命令就能一键搞定:
awk '$1 == "20287" {print $0}' your_data.txt
执行后会输出该样本的4条记录:
20287 AAJ51 FTO rs9939609 C__30090620_10 A T 20287 AAJ51 CAT rs1001179 C__11468118_10 C C 20287 AAJ51 CCL2 rs1024611 C___2590362_10 A G 20287 AAJ51 TAS2R38 rs10246939 C___9506826_10 T T
2. 提取特定基因的所有样本数据
比如要查看所有样本的FTO基因检测结果,同样用awk筛选第3列:
awk '$3 == "FTO" {print $0}' your_data.txt
输出结果:
18030 AAJ51 FTO rs9939609 C__30090620_10 A T 20287 AAJ51 FTO rs9939609 C__30090620_10 A T
3. 用Python转成结构化表格做分析
如果需要做后续的统计或可视化,用pandas把数据转成DataFrame会更方便:
import pandas as pd # 读取文本文件,指定列名 col_names = ["SampleID", "FixedID", "Gene", "SNP", "ProbeID", "Allele1", "Allele2"] df = pd.read_csv("your_data.txt", sep=" ", header=None, names=col_names) # 查看前3行数据确认格式 print(df.head(3))
输出的表格结构会非常清晰:
| SampleID | FixedID | Gene | SNP | ProbeID | Allele1 | Allele2 |
|---|---|---|---|---|---|---|
| 18030 | AAJ51 | FTO | rs9939609 | C__30090620_10 | A | T |
| 18030 | AAJ51 | CAT | rs1001179 | C__11468118_10 | C | C |
| 18030 | AAJ51 | CCL2 | rs1024611 | C___2590362_10 | G | G |
4. 统计每个SNP的基因型分布
基于上面的DataFrame,还能快速统计每个SNP位点的基因型出现次数:
# 把两个等位基因合并成基因型字符串(比如A/T) df["Genotype"] = df["Allele1"] + "/" + df["Allele2"] # 按SNP和基因型分组统计数量 genotype_stats = df.groupby(["SNP", "Genotype"]).size().unstack(fill_value=0) print(genotype_stats)
输出的统计结果一目了然:
| SNP | A/G | A/T | C/C | T/T |
|---|---|---|---|---|
| rs1001179 | 0 | 0 | 2 | 0 |
| rs1024611 | 1 | 0 | 0 | 0 |
| rs10246939 | 0 | 0 | 1 | 1 |
| rs9939609 | 0 | 2 | 0 | 0 |
内容的提问来源于stack exchange,提问作者gungu
相关产品推荐
相关产品推荐

