将两个字符的列读取为两个单独的列

将两个字符的列读取为两个单独的列

我有一个包含基因型数据的文件。第二列具有连接的特定遗传变体的两个等位基因,如下所示。

rs969931    CA  1.000   2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs2745406   CT  0.000   2.000   2.000   1.000   1.000   2.000   1.000   1.000
rs6939431   AG  0.000   0.000   0.000   0.000   0.000   0.000   1.000   0.000
rs1233427   AG  1.000   2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233426   AG  1.000   2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233425   GC  1.000   1.999   1.999   2.000   2.000   2.000   1.000   1.000
rs362546    GA  1.000   2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs909968    AG  0.000   2.000   2.000   1.000   1.000   1.000   1.000   1.000
rs909967    GA  1.000   2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs886381    AG  0.000   0.000   0.000   0.000   0.000   0.000   0.000   1.000

我需要创建一个新文件,其中等位基因作为两个单独的列,即将第二列分成两列。下面是所需的输出。有没有办法在 awk 中指定多个字段分隔符来实现此目的?

rs969931    C A  1.000  2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs2745406   C T  0.000  2.000   2.000   1.000   1.000   2.000   1.000   1.000
rs6939431   A G  0.000  0.000   0.000   0.000   0.000   0.000   1.000   0.000
rs1233427   A G  1.000  2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233426   A G  1.000  2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs1233425   G C  1.000  1.999   1.999   2.000   2.000   2.000   1.000   1.000
rs362546    G A  1.000  2.000   2.000   2.000   2.000   1.000   1.000   1.000
rs909968    A G  0.000  2.000   2.000   1.000   1.000   1.000   1.000   1.000
rs909967    G A  1.000  2.000   2.000   2.000   2.000   2.000   1.000   1.000
rs886381    A G  0.000  0.000   0.000   0.000   0.000   0.000   0.000   1.000

答案1

sub您可以使用以下函数来完成此操作awk

awk 'sub(/./,"& ",$2)1;' file

如果您想要制表符分隔的输出,您可以使用:

awk -v OFS="\t" 'sub(/./,"&\t",$2)1;' file

或者在各种其他工具中:

  • 珀尔

    perl -alne '$F[1]=~s/./$& /; print "@F"' file
    

    或者,对于制表符分隔的输出:

    perl -alne '$F[1]=~s/./$&\t/; print join "\t",@F' file
    
  • GNUsed

    sed -r 's/\S+\s+\S/& /' file
    
  • 其他sed

    sed  's/^[[:alnum:]]*[[:blank:]]*./& /' file
    
  • while read -r snp nt rest; do 
        printf "%s\t%s\t%s\t%s\n" "$snp" "${nt:0:1}" "${nt:0:1}" "$rest"
    done < file
    

答案2

用于:gsubawk

awk 'gsub(""," ",$2)1' file

结果:

rs969931  C A  1.000 2.000 2.000 2.000 2.000 2.000 1.000 1.000
rs2745406  C T  0.000 2.000 2.000 1.000 1.000 2.000 1.000 1.000
rs6939431  A G  0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000
rs1233427  A G  1.000 2.000 2.000 2.000 2.000 1.000 1.000 1.000
rs1233426  A G  1.000 2.000 2.000 2.000 2.000 1.000 1.000 1.000
rs1233425  G C  1.000 1.999 1.999 2.000 2.000 2.000 1.000 1.000
rs362546  G A  1.000 2.000 2.000 2.000 2.000 1.000 1.000 1.000
rs909968  A G  0.000 2.000 2.000 1.000 1.000 1.000 1.000 1.000
rs909967  G A  1.000 2.000 2.000 2.000 2.000 2.000 1.000 1.000
rs886381  A G  0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000

相关内容