我尝试采用如下所示的文件并输出$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
我无法弄清楚为什么在最后三行的开头有标签,而且我不确定如何在没有数据时放入空格(我可能只是将我的输入文件格式化为这些值为零。)
答案 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)