【问题标题】:Transpose column to row using awk使用 awk 将列转置为行
【发布时间】:2019-02-22 08:46:30
【问题描述】:

在我的数据文件中,有一个我感兴趣的列。因此,我使用 awk 仅打印出该列(awk '{print $4}')并使用“if”设置消除条件。但是,我不知道如何将该列中的每一行转换为新行。

输入:

1
2
3
4
5
6
7
8
9

想要的输出:

1  4  7
2  5  8
3  6  9

我检查了其他解决方案并尝试了,但没有一个能满足我的需求。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 我刚查过,不是的。
  • 您的输入总是带有x^2 行?如果你有一个15 行文件怎么办?

标签: awk


【解决方案1】:

你也可以在这里使用pr

$ seq 9 | pr -3ts' '
1 4 7
2 5 8
3 6 9
$ seq 9 | pr -5ts' '
1 3 5 7 9
2 4 6 8

数字表示您需要多少列,s 选项允许指定列之间的分隔符

【讨论】:

  • 只是一种创建输入数据的方法。seq 可用于创建数字序列,它允许根据需要指定开始、结束和步长值
  • 哦,我明白了。如果我想检查列上的每个数字,如果一个数字小于下一个数字,怎么办?
【解决方案2】:

使用 awk:

$ seq 9 | 
awk ' {
    i=((i=NR%3)?i:3)                # index to hash a
    a[i]=a[i] (a[i]==""?"":" ") $1  # space separate items to a[i]
} 
END {
    for(i=1;i<=3;i++)               # from 1 to 3 (yes, hardcoded)
        print a[i]                  # output
}'

输出:

1 4 7
2 5 8
3 6 9

【讨论】:

  • 谢谢!我也试过你的方法,它奏效了!我希望我可以选择多个答案!
【解决方案3】:

autogen 包中的columns 程序可以做到这一点,例如:

seq 9 | columns --by-column -w1 -c3

输出:

1 4 7
2 5 8
3 6 9

【讨论】:

  • 我没有尝试过你的方法,但谢谢你的帮助!
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2015-06-21
  • 2014-08-04
  • 2016-10-18
  • 2023-03-27
  • 2018-07-24
相关资源
最近更新 更多