将列转置为行

时间:2016-06-20 03:46:45

标签: unix awk transpose

我尝试使用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[$1]=a[$1]" "$2}END{for (i in a){print i " " a[i]}}'

谢谢

2 个答案:

答案 0 :(得分:0)

它的工作。尝试以下

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

或者你可以使用sort

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

答案 1 :(得分:0)

mmm awk。

$ cat bar.awk 
#! /usr/bin/awk -f
BEGIN{getline}
$1 != n {if(row)print row; n=$1; row = $0}
$1 == n {row = row FS $2}
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吃掉标题
当第一列更改时,$1 != n会注意到 n将以0开头,如果第一列(&第二行)也为零,则会出现问题,您必须将n初始化为其他内容
当第一列改变时,是时候打印上一行并开始收集下一行,
(如果该行为空,则最初不打印)

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

最后打印最后一行。

FS是当前字段分隔符。