我正在尝试格式化CpG甲基化调用从R包"methyKit"以简易床为格式。因为它是一个大文件,我不能在Excel中做。我也尝试过Seqmonk,但它不允许我以我想要的格式导出数据。Linux Awk/sed
可能是一个不错的选择,但我也是新手。基本上,我需要修剪"颜色"。列,添加"stop"列,转换"F"+";/"R"to "-"和freqC与2位小数。你能帮帮我吗?
来自:
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 67678 67679 0 3 -
1 67701 67702 0 3 -
1 67724 67725 0 3 -
1 67746 67747 0 3 -
1 67768 67769 0.333333 3 -
1 159446 159447 0 3 +
1 162652 162653 0 3 +
1 167767 167768 0.666667 3 +
1 167789 167790 0.666667 3 +
1 167797 167798 0 3 +
这应该是您真正想要的,生成一个BED6文件,在得分列中包含甲基化百分比:
$ cat foo.awk
BEGIN{OFS="t"}
{if(NR>1) {
if($4=="F") {
strand="+"
} else {
strand="-"
}
chromUse=gsub("chr", "", $2);
print chromUse,$3-1,$3,$1,$6,strand,$5
}}
然后用:
awk -f foo.awk input.txt > output.bed
额外的列7是覆盖率,因为基因组查看器将只显示单个分数列:
1 338 339 chr1.339 0.00 + 7
1 182 183 chr1.183 0.00 - 4
1 191 192 chr1.192 0.00 - 6
1 339 340 chr1.340 40.00 - 5
1 10006 10007 chr1.10007 53.85 + 13
1 10316 10317 chr1.10317 0.00 + 8
1 10345 10346 chr1.10346 88.89 + 9
1 10348 10349 chr1.10349 88.89 + 9
你可以根据需要进一步调整。
您想要的确切序列并不完全清楚,因为您的"From"
数据不对应于您显示为"To"
结果的内容,但如果您显示的是通用格式更改并且在"From"
数据中,则需要:
- 丢弃字段1,
- 从字段2的末尾检索
"chr"
值, - 如果第四个字段是
"F"
,则为"+"
,如果是"R"
,则为"-"
,否则保持不变, - 使用第3字段作为
"start"
,第3 + 1作为"stop"
(根据需要调整是否添加或减去1
以获得所需的"start"
和"stop"
值), - 打印第6个字段为
"freqc"
, - 输出第5个字段为
"Coverage"
,最后 - 输出修改第4字段为
"strand"
如果这是您的目标,那么使用名为from
的文件中的from数据,您可以执行以下操作:
awk '
BEGIN { OFS="t"; print "chr","start","stop","freqc","Coverage","strand" }
FNR > 1 {
match($2, /[[:digit:]]+$/, arr)
if ($4 == "F")
$4 = "+"
else if ($4 == "R")
$4 = "-"
print arr[0], $3, $3 + 1, $6, $5, $4
}
' from
说明,BEGIN
规则在awk
开始处理文件中的记录(行)之前运行。上面它只是将输出字段分隔符设置为tab
并打印标题。
第二条规则上FNR > 1
的条件(模式)处理第二条记录(行)上的from文件(跳过标题行)。FNR
是awk表示文件记录号的方式(尽管看起来N
和R
是向后的)。
match($2, /[[:digit:]]+$/, arr)
将第二个字段的尾随数字分割为arr
的第一个元素(例如arr[0]
),在这里不相关设置RSTART
和RLENGTH
内部变量,告诉您第一个数字从哪个字符开始以及有多少个数字。
if
和else if
语句将"F"
变为"+"
,"R"
变为"-"
。最后,print
语句只按照上面指定的顺序打印修改后的值和未更改的字段。
示例输出
在原始"From"
数据上运行上述命令将产生:
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 +
让我知道这是否接近你在你的问题中解释的,如果不是,在下面留言。
GNU Awk用户指南是一个伟大的呆呆/Awk参考。