客观的
我有一个名为 graph 的文件,其中通过列出节点之间的所有现有链接来包含图的文本描述。每一行包含一个链接,表示如下:
number1->number2
其中number2
是从编号为 的节点接收链接的节点编号number1
(有一条从number1
到 的链接number2
)。
我需要找到最“流行”的节点,它实际上是接收最多链接的节点。
限制条件
我只需要使用一个命令(带有多个管道)而不是
sed
orawk
命令。命令行应该只显示两个数字:最受欢迎的节点的数量,以及该节点收到的链接数量(不一定按这个顺序)。
图表文件里面有什么
110->41
74->125
117->29
135->85
24->68
34->25
58->81
18->77
108->20
36->89
45->43
75->28
57->18
135->5
74->126
18->7
40->63
18->123
9->17
133->2
86->10
91->12
125->74
133->25
121->53
135->41
55->81
60->25
16->78
47->40
112->30
12->99
71->107
135->42
31->53
108->99
54->55
49->69
37->24
26->31
64->93
47->65
98->14
108->34
15->60
80->119
40->65
41->110
42->13
95->56
134->62
18->29
40->47
43->125
103->102
18->93
79->68
21->35
87->116
108->124
40->29
94->75
48->33
59->20
18->119
18->63
51->17
45->133
18->22
6->72
43->15
108->127
73->115
12->98
77->88
43->102
29->67
12->106
65->30
46->94
126->13
77->135
126->129
52->10
43->129
89->67
118->91
109->57
80->134
18->38
7->123
25->121
114->21
13->125
62->50
46->28
43->70
99->108
24->130
14->9
126->85
8->116
89->36
128->34
28->109
126->5
95->86
20->83
95->76
86->111
89->112
103->78
132->39
53->121
41->54
101->122
18->33
18->116
133->120
129->85
12->71
19->46
12->118
59->25
79->6
81->58
119->127
31->26
15->59
92->7
33->44
123->124
40->112
86->74
30->47
79->111
27->23
18->71
75->94
38->29
77->75
120->104
99->127
23->22
75->32
11->115
52->111
79->130
40->89
4->114
89->4
123->7
17->97
85->53
18->11
55->54
93->96
43->126
126->42
113->8
40->8
35->21
130->127
9->98
83->131
3->64
105->103
18->68
23->122
0->77
124->25
52->67
77->25
48->1
17->103
48->10
111->79
56->52
104->105
69->129
18->27
29->115
8->114
108->25
61->106
48->6
68->118
118->68
130->124
135->125
18->14
67->92
4->80
17->100
10->132
106->61
39->19
8->113
40->38
88->66
15->39
46->32
9->43
37->111
1->35
128->109
91->128
40->117
18->64
20->77
82->25
86->87
18->6
37->79
66->31
86->33
43->125
16->2
107->88
47->117
47->88
20->135
73->84
32->49
72->54
89->84
52->56
29->132
117->52
50->78
43->108
61->19
18->0
9->0
86->7
39->64
44->86
12->43
11->116
1->21
90->51
40->3
18->95
78->131
100->16
127->130
133->100
126->41
76->95
114->25
63->27
118->51
34->128
76->50
27->25
131->82
116->66
43->45
35->15
17->4
36->40
122->3
78->82
102->105
18->107
17->120
5->129
114->15
2->48
133->16
84->73
18->115
18->37
81->24
18->130
123->113
97->5
37->72
91->90
20->24
115->38
96->25
1->15
70->101
89->97
79->37
22->101
40->100
3->25
40->36
答案1
这应该有效:
cut -d '>' -f 2 graph | sort | uniq -c | sort -n | tail -n 1
这将打印到该节点的链接数以及同一行上的节点(链接数在前,节点在第二)。如果您希望它们显示在单独的行上,请使用以下命令:
cut -d '>' -f 2 graph | sort | uniq -c | sort -n | tail -n 1 | tr ' ' '\n'
或者你可以有很好的人类可读的输出,如下所示:
cut -d '>' -f 2 graph | sort | uniq -c | sort -n | tail -n 1 | xargs printf 'Number of links: %s\nNode: %s\n'
首先,我们cut
以输出>
作为分隔符并得到第二个字段(-f 2
),它是边通向的节点。
接下来我们使用sort
.我们进行排序,因为否则uniq
将无法按预期工作(uniq
不会检测重复的行,除非它们相邻)。
接下来我们用来uniq -c
获取每个节点的计数。
我们使用选项按数字顺序再次排序-n
。在这一秒之后sort
,输出按从传入链接数量最少的节点到传入链接最多的节点的顺序排列。
tail -n 1
返回最后一行,即具有最多传入链接的节点的行。
第二个版本中的部分tr
用换行符替换了计数和节点之间的空格字符。
答案2
阅读man cut sort uniq tail
并做类似的事情
cut '-d>' -f 2 graph | \
sort -n | \
uniq -c | \
sort -n | \
tail -n 1