用空格打印awk中的二维数组

时间:2014-12-04 18:15:36

标签: arrays awk

我尝试采用如下所示的文件并输出$1为列,$2为行。

$ cat file
8       A       11.56
6       A       1.46
10      A       1.60
7       A       19.36
9       A       7.09
9       C       0.63
8       C       3.64
7       C       5.20
8       G       12.20
6       G       1.62
7       G       17.39
10      G       2.12
9       G       7.77
9       T       0.67
8       T       3.07
7       T       4.62

所需的输出是:

B       6       7       8       9       10
A       1.46    19.36   11.56   7.09    1.60 
C               5.20    3.64    0.63  
T               4.62    3.07    0.67
G       1.62    17.39   12.20   7.77    2.12G 

我已经编写了以下代码来充分利用它,但仍然存在一些错误。

awk '
BEGIN{OFS="\t"
        print "B",6,7,8,9,10
        }
{
a[$2""$1]=$3
b[$2]
}
END{ORS="\t"
for (c in b)
        {
        print c
        for (i=6;i<11;i++)
                {
                for (r in a)
                        if (r==c""i)
                                print a[c""i]""c""i
                }
        print "\n"
        }
}' file

输出&gt;

B       6       7       8       9       10
A       1.46A6  19.36A7 11.56A8 7.09A9  1.60A10
        C       5.20C7  3.64C8  0.63C9
        T       4.62T7  3.07T8  0.67T9
        G       1.62G6  17.39G7 12.20G8 7.77G9  2.12G10

我无法弄清楚为什么在最后三行的开头有标签,而且我不确定如何在没有数据时放入空格(我可能只是将我的输入文件格式化为这些值为零。)

3 个答案:

答案 0 :(得分:4)

我这样做:

awk -F "\t" -v OFS="\t" '
    {v[$2,$1] = $3; k[$2]} 
    END {
        print "B",6,7,8,9,10
        for (key in k) {
            printf "%s", key
            for (i=6; i<=10; i++) {
                printf "%s%s", OFS, ((key SUBSEP i) in v ? v[key,i] : "")
            }
            print ""
        }
    }
' file

输出

B       6       7       8       9       10
A       1.46    19.36   11.56   7.09    1.60
C               5.20    3.64    0.63    
T               4.62    3.07    0.67    
G       1.62    17.39   12.20   7.77    2.12

答案 1 :(得分:0)

不修复6-10,可以是$ 1中的任何字符串

awk '{a[$2 FS $1]=$3;b[$1];c[$2]}
END{ printf "B\t" ;for (i in b) printf i OFS;printf RS
     for (i in c) 
      { printf i OFS
        for (j in b)
            printf a[i FS j] OFS
        printf RS
      }
    }' OFS="\t" infile

答案 2 :(得分:0)

如果OP接受依赖于gawk的解决方案(具体取决于多维数组和asort内置),那么这是我的

% cat tabular.awk
   {col[$1]=$1;row[$2]=$2;val[$2,$1]=$3}
END{asort(col); asort(row)
    printf "B" ; for(j in col) printf "%10d", col[j]; print ""
    for(i in row) {
        printf row[i]
        for(j in col) printf "%10s", val[row[i],col[j]]
        print ""}}
% awk OP.dat -f tabular.awk
B         6         7         8         9        10
A      1.46     19.36     11.56      7.09      1.60
C                5.20      3.64      0.63          
G      1.62     17.39     12.20      7.77      2.12
T                4.62      3.07      0.67          
% 

如果OP需要不同的数值数据格式,他/她可以修改语句

val[$2,$1] = $3

在每行的默认处理中,例如,

val[$2,$1] = sprintf("%10.2e", $3)