列を行列に変換

列を行列に変換

次の結果を得るスクリプトがあります。
最初の列:スロット番号2番目の列
:ポート番号3
番目の列:接続数

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

おすすめ記事