针对不同数据组合的更高效的awk解析器

时间:2015-03-12 15:13:19

标签: awk

我有一个awk解析器,如果数据是NC_0000(四位数),那么效果很好,但如果不是那么,则解析数据。我不确定获得所需输出的最有效方法。谢谢你:)。

代码:

awk 'FNR > 1 && match($0, /NC_0000([0-9]*)\..*g\.([0-9]+)(.)>(.)/, a){ print a[1], a[2], a[2], a[3], a[4] }' OFS='\t' ${id}.txt > ${id}_parse.txt

例如:

NC_000013.10:g.20763466G>A
NC_00001.10:g.20763477C>G 

将被解析为

的所需输出
13  20763466    20763466    G   A 
1   20763477    20763477    C   G

但是这个

NC_000004.11:g.41749507G>T

无效。下面列出了所需的输出格式,并始终如此。谢谢你:)。

解析规则:

  1. NC_之后的4个零(并非总是如此)和之前的数字。

  2. g后面的
  3. 数字。用标签

  4. 重复两次
  5. >

  6. 之前的字母
  7. >

  8. 之后的字母

    使用

    添加
    awk -F"[_.>]" '{a=length($4);b=substr($4,1,a-1);print $2+0,b,b,substr($4,a),$5}' OFS="\t" Target.txt
    0
    4004    244     244     G       A               NC
    3924    288     288     C       A               NC
    3924    385     385     G       A               NC
    

    谢谢:)

1 个答案:

答案 0 :(得分:1)

awk应该:

cat file
NC_000013.10:g.20763466G>A
NC_00001.10:g.20763477C>G
NC_000004.11:g.41749507G>T

awk -F"[_.>]" '{print $2+0,substr($4,1,8),substr($4,1,8),substr($4,9,1),$5}' OFS="\t" file
13      20763466        20763466        G       A
1       20763477        20763477        C       G
4       41749507        41749507        G       T

如果g.之后的位数可能会发生变化,请使用:

awk -F"[_.>]" '{a=length($4);b=substr($4,1,a-1);print $2+0,b,b,substr($4,a),$5}' OFS="\t" file