我有一个脚本可以获取以下结果
第一列:插槽号
第二列:端口号
第三列:连接数
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