将列转置为行

transpose column to row

我尝试使用 awk 转置下面的文件

 n   counts
 1  -0.1520
 1  0.0043
 1  -0.4903
 10 0.0316
 10 -0.4076
 10 -0.1175
 200 0.2720
 200 -0.2007
 200 0.0559

我需要这样的输出

1   -0.1520 0.0043 -0.4903
10   0.0316 -0.4076 -0.1175
200  0.2720 -0.2007 0.0559

我尝试了但没有成功

awk 'NR==1{print} NR>1{a[]=a[]" "}END{for (i in a){print i " " a[i]}}'

谢谢

它的工作。试试下面

awk 'NR==1{print} NR>1{a[]=a[]" "}END{for (i in a){print i " " a[i]}}' file | tac

或者您可以使用排序

 awk 'NR==1{print} NR>1{a[]=a[]" "}END{for (i in a){print i " " a[i]}}' file | sort -k1 -n

嗯嗯嗯。

$ cat bar.awk 
#! /usr/bin/awk -f
BEGIN{getline}
 != n {if(row)print row; n=; row = [=10=]}
 == n {row = row FS }
END{ print row }

$ ./bar.awk foo
1  -0.1520 -0.1520 0.0043 -0.4903
10 0.0316 0.0316 -0.4076 -0.1175
200 0.2720 0.2720 -0.2007 0.0559

getline 吃掉了 header
!= n 会在第一列更改时通知
n 将从 0 开始,因此如果第一列(和第二行)也为零,则会出现问题,您必须将 n 初始化为其他内容
当第一列发生变化时,是时候打印上一行并开始收集下一行了,
(如果该行是空的,就像最初一样,不要打印它)

当第一列与上一行相同时,
只需将第二个值附加到您的行。

最后打印最后一行。

FS 是当前字段分隔符。