将列转换为矩阵

将列转换为矩阵

我有一个脚本可以获取以下结果
第一列:插槽号
第二列:端口号
第三列:连接数

1 1 23,        
1 2 0,        
1 3 38,        
1 4 34,    
2 1 8,   
2 2 18,   
2 3 0,   
2 4 22,   
4 1 6,   
4 2 18,   
4 3 10,   
4 4 22,   

现在的问题是如何将其转置为更漂亮的矩阵(行 x 槽),如下所示。

         Slot #
      1 | 2 | 3 | 4 |           
P  1| 23| 8 | - | 6 |
o  2| 0 | 18| - | 18|
r  3| 38| 0 | - | 10|
t  4| 34| 22| - | 22|
#

我认为使用 awk 是可行的方法,但不确定如何开始。

答案1

本质上你要求的是列联表(又名交叉表或交叉表)。例如与GNU 数据混合

datamash -sW crosstab 2,1 unique 3 < file
    1   2   4
1   23, 8,  6,
2   0,  18, 18,
3   38, 0,  10,
4   34, 22, 22,

如果您想从数据中删除尾随逗号,一个简单的选项是tr

tr -d , < file | datamash -sW crosstab 2,1 unique 3
    1   2   4
1   23  8   6
2   0   18  18
3   38  0   10
4   34  22  22

如果您想添加“缺失”列,则需要提供填充数据 - 要么

{ tr -d , < file ; printf '3 %d -\n' {1..4} ; } | 
  datamash -sW crosstab 2,1 unique 3
    1   2   3   4
1   23  8   -   6
2   0   18  -   18
3   38  0   -   10
4   34  22  -   22

或者只提供一个点并让其datamash填充其余部分

{ tr -d , < file ; printf '3  1 -\n' ; } | 
  datamash --no-strict --filler=- -sW crosstab 2,1 unique 3
    1   2   3   4
1   23  8   -   6
2   0   18  -   18
3   38  0   -   10
4   34  22  -   22

答案2

二手公关 | column -t 显示我想要的内容。添加了更多我的结果以显示完整的矩阵。我认为第一列和第二列是多余的,并将其从我的数据集中删除。所以test_3.txt只包含第3列的数据结果。

pr -ts" " --columns 9 test_3.txt | column -t
23  8   6   11  18  33  39  16  33
0   18  18  32  18  16  27  13  12
38  0   10  10  21  16  24  16  29
34  22  22  20  16  16  33  21  21
33  23  19  16  13  10  29  16  53
33  19  8   21  10  13  21  17  29
43  31  20  19  14  15  15  0   9

相关内容