【问题标题】:transpose column to row [duplicate]将列转置为行[重复]
【发布时间】:2016-06-21 09:13:18
【问题描述】:

我尝试过使用 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]}}'

谢谢

【问题讨论】:

  • 您遇到了什么错误?
  • 到底是什么问题?输出没有排序吗?间距不完全符合要求吗?
  • 我修改了分隔字段,并尝试了 awk 'BEGIN {FS=OFS=","} NR>1{a[$1]=a[$1]","$2}END{ for (i in a){print i "," a[i]}}' file > outfile.txt 也不起作用。

标签: unix awk transpose


【解决方案1】:

它的工作。试试下面

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

或者你可以使用排序

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

【讨论】:

  • 注意:不能保证for (i in a){print i " " a[i]}的输出顺序
【解决方案2】:

嗯嗯。

$ 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 开始,因此如果第一列(和第二行)也为零,则会出现问题,您将不得不初始化 @ 987654325@到别的地方
当第一列发生变化时,是时候打印上一行并开始收集下一行了,
(如果该行是空的,因为它最初是空的,不要打印它)

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

最后打印最后一行。

FS 是当前字段分隔符。

【讨论】:

  • 谢谢!我想通了使用 dos2unix。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2021-03-02
  • 1970-01-01
  • 2013-10-01
  • 2023-03-27
相关资源
最近更新 更多