拆分行并跳过awk中的空位

时间:2016-12-14 10:54:00

标签: bash shell awk sed

我有这样的数据:

AA_MAF  EA_MAF  ExAC_MAF
-   -   -
G:0.001445  G:0.0044    -
-   -   -
-   -   C:0.277
C:0.1984    C:0.1874    C:0.176
G:0.9296    G:0.9994    G:0.993&C:8.237e-06
C:0.9287    C:0.9994    C:0.993&T:5.767e-05

我需要将所有列拆分为:& - 这意味着将所有字母(A,C,G,T)与其频率(数字后跟字母)分开。这非常复杂,我不确定是否可以解决。

要求输出与标签分开:

AA_MAF  AA_MAF  EA_MAF  EA_MAF  ExAC_MAF    ExAC_MAF    ExAC_MAF    ExAC_MAF
-       -       -   -   -   -
G   0.001445    G   0.0044  -   -   -   -
-       -       -   -   -   -
-       -       C   0.277   -   -
C   0.1984  C   0.1874  C   0.176   -   -
G   0.9296  G   0.9994  G   0.993   C   8.24E-006
C   0.9287  C   0.9994  C   0.993   T   5.77E-005

如果数组为空,请尝试替换-

我的尝试是:

awk -v OFS="\t" '{{for(i=1; i<=NF; i++) sub(":","\t",$i)}; sub ("&","\t",$i) 1'}' IN_FILE |  awk 'BEGIN { FS = OFS = "\t" } { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = "-" }1'

2 个答案:

答案 0 :(得分:1)

如果不需要尾部斜杠,可以使用以下命令:

$ awk -F'[ \t:&]+' -v OFS='\t' '{$1=$1}1' file
AA_MAF  EA_MAF  ExAC_MAF
-   -   -
G   0.001445    G   0.0044  -
-   -   -
-   -   C   0.277
C   0.1984  C   0.1874  C   0.176
G   0.9296  G   0.9994  G   0.993   C   8.237e-06
C   0.9287  C   0.9994  C   0.993   T   5.767e-05

如果你需要斜杠:

$ awk -F'[ \t:&]+' -v OFS='\t' '{$1=$1;for(i=NF+1;i<=8;i++)$i="-"}1' file
AA_MAF  EA_MAF  ExAC_MAF    -   -   -   -   -
-   -   -   -   -   -   -   -
G   0.001445    G   0.0044  -   -   -   -
-   -   -   -   -   -   -   -
-   -   C   0.277   -   -   -   -
C   0.1984  C   0.1874  C   0.176   -   -
G   0.9296  G   0.9994  G   0.993   C   8.237e-06
C   0.9287  C   0.9994  C   0.993   T   5.767e-05

答案 1 :(得分:1)

awk '{for (i=1;i<=NF;i++) {
        v1 = v2 = $i
        if ($i ~ /:/ ) { gsub(/:.*/, "", v1); gsub( /.*:/, "", v2)}
        printf( "%s%s%s%s", v1, OFS, v2, OFS)
        }
      print ""
      }' YourFile

检查每个字段内容,如果是“:”里面,如果是这样的话,将内容分开,如果不重复,则打印两个值之间的分隔符,直到字段结尾。为每一行(包括标题)

执行此操作