bed后缀名 *.bed是什么文件,怎么处理 .bed` 在生信里其实有 **两种完全不同的格式**,最容易混淆:

.bed 在生信里其实有 两种完全不同的格式,最容易混淆:

  1. UCSC BED(基因组坐标文件,纯文本,tab 分割,扩展名 .bed
    只是“区域列表”,和 GWAS 无关,我们脚本里用的就是这种

  2. PLINK 二进制 BED( trio:.bed..bim..fam
    真正的基因型矩阵,不可读文本,需要 PLINK 软件操作。

下面给你 30 秒把两种格式彻底分清,并演示 “UCSC BED” 怎么生成/查看/转换


一、UCSC BED(文本,脚本里用的)
格式(最少 3 列,可扩展)

chrom  chromStart  chromEnd  [name]  [score]  [strand]  …

示例

1  123456  123457  rs123456  0  +

列说明

  • chrom:chr1、chr2 … 或 1、2 … 都可以
  • chromStart:0-based 左端
  • chromEnd:1-based 右端(所以 SNP 位置 start = bp-1,end = bp)
  • 后面任意加列,不影响 bedtools

二、PLINK 二进制 BED(非文本)

  • plink --make-bed 生成, trio 文件:
    .bed(二进制基因型)
    .bim(SNP 信息,文本)
    .fam(样本信息,文本)
  • 不能直接 lesscat,必须 plink --bfile ... 操作。

三、我们脚本里的 .bed 是哪一种?
脚本第 2 步生成的 gwas_coord.bed 就是 UCSC BED,纯文本,随便看:

head __add_rsID_tmp/gwas_coord.bed
1	123456	123457
1	234567	234568
...

目的:让 bedtools 把“坐标”与 dbSNP 索引做 overlap,从而拿到 rsID。


四、常用操作速查

  1. 文本查看
less -S file.bed
  1. 把 GWAS 的 CHR/BP 直接变 3 列 BED(0-based)
awk 'BEGIN{OFS=FS="\t"} {print $1, $2-1, $2, $3, $4}' your.tsv > tmp.bed
# 列:CHR  start  end  A1  A2
  1. 用 bedtools 取交集(脚本核心命令)
bedtools intersect -a tmp.bed -b dbsnp151.grch37.rsid.bed -wa -wb > overlap.txt
  1. 把 BED 变回 VCF/TSV
awk '{print $1"\t"($2+1)"\t"$4"\t"$5}' overlap.txt
  1. 如果你手上有 PLINK 二进制 trio(.bed..bim..fam
    想“看”SNP 列表,别去碰 .bed,直接读 .bim
cut -f2 file.bim | head   # 第二列就是 rsID

五、一句话总结

  • 文本能 less.bed → UCSC BED,坐标而已,随便改。
  • 不能 less.bed → PLINK 二进制,必须 plink --bfile 操作。

我们脚本里只用 UCSC BED,生成、查看、改都就是普通文本文件,没有任何特殊用法

例如

#!/usr/bin/env bash
set -euo pipefail

#-------------- 参数 --------------
GWAS_IN=${1:? "用法: $0 <your_GWAS.tsv>"}
GWAS_OUT="${GWAS_IN%.*}.rsID.tsv"

#-------------- 路径 --------------
DIR=$(pwd)
TMP="$DIR/__add_rsID_tmp"
mkdir -p "$TMP"

DBSNP_URL="https://zenodo.org/record/3775883/files/dbsnp151.grch37.rsid.bed.gz"
DBSNP="$TMP/dbsnp151.grch37.rsid.bed"

#-------------- 依赖检查 --------------
command -v bedtools >/dev/null 2>&1 || {
  echo ">>> 安装 bedtools ..."
  if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    sudo apt-get update && sudo apt-get install -y bedtools
  elif [[ "$OSTYPE" == "darwin"* ]]; then
    brew install bedtools
  else
    echo "请手动安装 bedtools 后再运行"; exit 1
  fi
}

command -v python3 >/dev/null 2>&1 || { echo "请先安装 python3"; exit 1; }

#-------------- 1. 下载 dbSNP 索引 --------------
if [[ ! -f "$DBSNP" ]]; then
  echo ">>> 下载 dbSNP151 GRCh37 索引 ..."
  wget -qO- "$DBSNP_URL" | gunzip -c > "$DBSNP"
fi

#-------------- 2. 提取 CHR/BP/A1/A2 并去重 --------------
echo ">>> 提取坐标 ..."
python3 - <<PY
import pandas as pd, sys, os
f = "$GWAS_IN"
df = pd.read_csv(f, sep='\t')
need = ['CHR','BP','A1','A2']
miss = [x for x in need if x not in df.columns]
if miss: sys.exit(f"缺失列: {miss}")
(df[need].drop_duplicates()
   .assign(START=lambda x: x.BP, END=lambda x: x.BP)
   .to_csv("$TMP/gwas_coord.bed", sep='\t', index=False, header=False))
PY

#-------------- 3. 链对齐(防止翻转) --------------
echo ">>> 链对齐 ..."
# 用 bedtools 把 REF/ALT 与 dbSNP 完全一致的对上
bedtools intersect -a "$TMP/gwas_coord.bed" \
                   -b "$DBSNP" -wa -wb \
| awk '($3==$8 && $4==$9){print $1"\t"$2"\t"$3"\t"$4"\t"$7}' \
> "$TMP/chr2rsID.txt"

#-------------- 4. 合并回 GWAS 表 --------------
echo ">>> 写入 rsID ..."
python3 - <<PY
import pandas as pd
gwas = pd.read_csv("$GWAS_IN", sep='\t')
conv = pd.read_csv("$TMP/chr2rsID.txt", sep='\t',
                   names=['CHR','BP','A1','A2','rsID'])
out = (gwas.merge(conv, on=['CHR','BP','A1','A2'], how='left')
           .rename(columns={'rsID':'SNP'}))
# 把没匹配到的 SNP 列留空,方便用户自行过滤
out.to_csv("$GWAS_OUT", sep='\t', index=False)
print(f"完成!输出 => {GWAS_OUT}")
print(f"匹配率: {out['SNP'].notna().mean():.1%}")
PY

#-------------- 5. 清临时 --------------
rm -rf "$TMP"
echo ">>> All done!"
生物信息学中,BED文件记录基因组位置信息,也能存储与位置相关的信息,其处理方式如下: ### 数据提取 可从BED文件中提取特定的信息,如提取特定染色体区域的记录。这可借助编程语言(如Python)实现,使用文件读取操作逐行读取BED文件,依据染色体名称和位置范围筛选出符合条件的记录。示例代码如下: ```python def extract_region(bed_file, chrom, start, end): selected_records = [] with open(bed_file, 'r') as file: for line in file: fields = line.strip().split('\t') record_chrom = fields[0] record_start = int(fields[1]) record_end = int(fields[2]) if record_chrom == chrom and record_start >= start and record_end <= end: selected_records.append(line) return selected_records # 使用示例 bed_file = 'example.bed' chromosome = 'chr1' start_pos = 1000 end_pos = 2000 result = extract_region(bed_file, chromosome, start_pos, end_pos) for record in result: print(record) ``` ### 数据合并 当有多个BED文件,且需将它们合并成一个文件时,可按染色体和位置顺序对记录进行排序,然后合并。可使用Linux命令行工具`sort`和`cat`来实现。示例命令如下: ```bash # 对每个BED文件进行排序 sort -k1,1 -k2,2n file1.bed > sorted_file1.bed sort -k1,1 -k2,2n file2.bed > sorted_file2.bed # 合并排序后的文件 cat sorted_file1.bed sorted_file2.bed > merged.bed ``` ### 数据比较 比较两个BED文件,找出它们之间的交集、并集和差集等关系。可使用`bedtools`工具,它是生物信息学中处理BED文件的常用工具集。示例命令如下: ```bash # 找出两个BED文件的交集 bedtools intersect -a file1.bed -b file2.bed > intersection.bed # 找出两个BED文件的并集 bedtools unionbedg -i file1.bed file2.bed > union.bed # 找出file1中有但file2中没有的区域 bedtools subtract -a file1.bed -b file2.bed > difference.bed ``` ### 数据转换 有时需将BED文件转换为其他格式,或从其他格式转换为BED文件。例如,将BED文件转换为GFF格式,可使用编程语言编写脚本,按GFF文件格式要求重新组织BED文件的信息。示例代码如下: ```python def bed_to_gff(bed_file, gff_file): with open(bed_file, 'r') as bed, open(gff_file, 'w') as gff: for line in bed: fields = line.strip().split('\t') chrom = fields[0] start = fields[1] end = fields[2] # 这里简单设置GFF文件的其他字段,可根据实际需求修改 source = 'bed_to_gff' feature = 'region' score = '.' strand = '.' frame = '.' attributes = 'ID=bed_region;' gff_line = f'{chrom}\t{source}\t{feature}\t{start}\t{end}\t{score}\t{strand}\t{frame}\t{attributes}\n' gff.write(gff_line) # 使用示例 bed_file = 'example.bed' gff_file = 'example.gff' bed_to_gff(bed_file, gff_file) ``` ### 数据可视化 为直观展示BED文件中的信息,可使用基因组浏览器(如UCSC Genome Browser、IGV等)。将BED文件上传到基因组浏览器中,它会在基因组坐标上显示出BED文件记录的区域,方便观察和分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值