将括号内容拆分为新列

时间:2016-02-04 19:53:59

标签: regex awk split brackets

我一直在努力让这个括号内容被提取和拆分,但我不能完成它。 我尝试用sed和tr用\ t替换'[]',然后一步一步地做,但没有运气。

tr '[''\t'`

即使是朋友也试过vi,但它太复杂而且无法工作:

:%s/\([A-Za-z_]*\)\t\([0-9A-Z-]*\)\t\([0-9]*\)\t[A-Z]*\[\(.\).\(.\)\][A-Z]*\t+\([a-z0-9]*\)\t/\1\t\2\t\3\t\4\t\5\t\6\t\7/g

还尝试使用python,但它说要解压缩的值太多了

它必须是括号或类似的问题。 所以,我有这个表,但包含数十万行

Species X-C982  282 AACTGTCCATTGACTCTGATAGTGTAAC[G/A]GAGGAAGATGTGCCTAAAAGGAAGAA scaffold7
Species X-A757  158 CCAAGACAGACAGTGGGGTAGAATTTAC[T/C]ACAACAGGCAGTCACAGTGACAAAGG scaffold7
Species X-G39   842 TGATGAACATCAGACTTTTAAACTTTGC[T/C]CATGCATAAATCTGTATATCACGCTA scaffold9

我需要提取内容并将其从'/'拆分,以便它看起来像这样(所有标签分开):

Species X-C982  282  G  A  scaffold7
Species X-A757  158  T  C  scaffold7
Species X-G39   842  T  C  scaffold9

很抱歉没有发布任何好的代码,但没有一个正常工作。

我知道在excel中这可以很容易地完成,但是当有时使用超过一百万行时,这是不可能的。 提前致谢

3 个答案:

答案 0 :(得分:3)

$ awk -F'[][[:space:]/]+' -v OFS='\t' '{print $1, $2, $3, $5, $6, $8}' file
Species X-C982  282     G       A       scaffold7
Species X-A757  158     T       C       scaffold7
Species X-G39   842     T       C       scaffold9

如果您将来要做更多的文本处理任务,请阅读Arnold Robbins撰写的Effective Awk Programming,4th Edition一书。

答案 1 :(得分:1)

使用awk,您可以像这样定义字段分隔符:

awk -F'[] ][ACTG]*[[ ]|/' '$1=$1' file

答案 2 :(得分:0)

如果对" [X / Y]"的发生次数有任何疑问?可能在核苷酸序列中,那么检查可能会更好。

假设输入以制表符分隔,其中$ 3是长核苷酸序列,下面说明可以做什么:

 awk -F\\t '
   BEGIN{OFS=FS}
   $3 ~ /\[/ { split($3, a, "[][/]"); print $1,$2,a[2],a[3],$4; next}
   {print $1,$2,"","",$4} '