열을 행렬로 변환

열을 행렬로 변환

다음 결과를 얻는 스크립트가 있습니다.
첫 번째 열: 슬롯 번호
두 번째 열: 포트 번호
세 번째 열: 연결 수

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

중고 PR 열 -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

관련 정보