![转置文件中的数据](https://linux22.com/image/170568/%E8%BD%AC%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE.png)
我将以下数据集保存在文本文件中,如下所示;
Case name Case_12
d1 0.2
d2 0.1
d3 2.2
d4 1.29
d5 0
d6 -1.10
d7 0.007
d8 -0.421
d9 -0.680
d10 -0.206
Case name Case_1
d1 0.2
d2 0.1
d3 2.2
d4 1.17
d5 0
d6 -1.09
d7 0.003
d8 -0.458
d9 -0.640
d10 -0.030
Case name Case_2
d1 0.2
d2 0.1
d3 2.2
d4 1.15
d5 0
d6 -1.17
d7 0.005
d8 -0.504
d9 -0.670
d10 -0.023
有没有办法以输出想要的方式对以下数据进行后处理;
Case name d1 d2 d6 d7 d8 d9 d10
Case_1 0.2 0.1 -1.09 0.003 -0.458 -0.640 -0.030
Case_2 0.2 0.1 -1.17 0.005 -0.504 -0.670 -0.023
Case_12 0.2 0.1 -1.10 0.007 -0.421 -0.680 -0.206
谢谢您的帮助!
答案1
如果每组中的 s 数量d
相同并且已排序,我们可以这样做:
<infile awk -v d=10 '
BEGIN{ printf "Case_name" ;
while (i++<d) { printf FS "d"i; };
print "";
}
/Case name/{ if (line) { print line }; line=$NF; next }
{ line = line FS $NF; }
END{ print line }' |column -t
另一种替代方法,避免在d
s 上手动生成标头:
<infile awk '
/Case name/{ if (h && !is_h) { print h; is_h=1 };
if (line) { print line; };
h="Case_name"; line= $NF;
next;
}
!is_h { h= (h? h FS $1 : $1); }
{ line= (line? line FS $NF : $NF); }
END{ print line }' |column -t
输出:
Case_name d1 d2 d3 d4 d5 d6 d7 d8 d9 d10
Case_12 0.2 0.1 2.2 1.29 0 -1.10 0.007 -0.421 -0.680 -0.206
Case_1 0.2 0.1 2.2 1.17 0 -1.09 0.003 -0.458 -0.640 -0.030
Case_2 0.2 0.1 2.2 1.15 0 -1.17 0.005 -0.504 -0.670 -0.023