如何将methyKit输出的大型CpG甲基化文件转换为BED格式?
用Awk批量转换methyKit输出为简化BED格式
我需要把R包methyKit生成的CpG甲基化结果转成简易BED格式,因为文件体积太大,Excel根本处理不了,试过Seqmonk也导出不了需要的格式,想用Linux的Awk工具来做,但不太熟悉。需要完成这些操作:
- 去掉
chr列的chr前缀 - 新增
stop列,值为base列数值加1 - 把
strand列的F替换成+,R替换成- - 将
freqC保留两位小数
输入示例
chrBase chr base strand coverage freqC freqT chr1.339 chr1 339 F 7 0.00 100.00 chr1.183 chr1 183 R 4 0.00 100.00 chr1.192 chr1 192 R 6 0.00 100.00 chr1.340 chr1 340 R 5 40.00 60.00 chr1.10007 chr1 10007 F 13 53.85 46.15 chr1.10317 chr1 10317 F 8 0.00 100.00 chr1.10346 chr1 10346 F 9 88.89 11.11 chr1.10349 chr1 10349 F 9 88.89 11.11
输出示例
chr start stop freqc Coverage strand 1 339 340 0.00 7 + 1 183 184 0.00 4 - 1 192 193 0.00 6 - 1 340 341 40.00 5 - 1 10007 10008 53.85 13 + 1 10317 10318 0.00 8 + 1 10346 10347 88.89 9 + 1 10349 10350 88.89 9 +
解决方案:Awk命令
直接在终端运行以下命令,把input.txt替换为你的实际输入文件名,output.bed替换为目标输出文件名:
awk 'BEGIN{OFS="\t"} NR==1{print "chr", "start", "stop", "freqc", "Coverage", "strand"; next} { sub(/^chr/,"",$2); stop=$3+1; strand=($4=="F")?"+":"-"; printf "%s\t%d\t%d\t%.2f\t%d\t%s\n", $2, $3, stop, $5, $6, strand }' input.txt > output.bed
命令说明:
BEGIN{OFS="\t"}:设置输出字段分隔符为制表符,保证格式规整NR==1:单独处理第一行表头,输出自定义的BED格式表头后跳过原表头sub(/^chr/,"",$2):移除第二列(chr列)开头的chr前缀stop=$3+1:计算stop列值(BED格式为左闭右开区间,因此stop是base值加1)strand=($4=="F")?"+":"-":将strand列的F转为+,R转为-printf:按指定格式输出内容,%.2f确保freqC保留两位小数
内容的提问来源于stack exchange,提问作者Link Humble
相关产品推荐
相关产品推荐

