如何格式化一个大的TXT文件



我正在尝试格式化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表示文件记录号的方式(尽管看起来NR是向后的)。

match($2, /[[:digit:]]+$/, arr)将第二个字段的尾随数字分割为arr的第一个元素(例如arr[0]),在这里不相关设置RSTARTRLENGTH内部变量,告诉您第一个数字从哪个字符开始以及有多少个数字。

ifelse 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参考。

相关内容

  • 没有找到相关文章

最新更新