【发布时间】:2018-10-29 04:03:39
【问题描述】:
我有一个很长的文件,其中包含依赖项列表、它们的版本以及依赖项所属的服务。此文件按块排序和分隔。
这是我指的文件文件中的一个 sn-p:
foo.bar.baz:json:jar:2.2.2:compile service: ServiceTwo
foo.bar.baz:json:jar:2.2.10:compile service: ServiceThree
@
asm:asm:jar:3.3.1:compile service: ServiceOne
asm:asm:jar:3.3.1:compile service: ServiceTwo
asm:asm:jar:3.3.0:compile service: ServiceThree
@
hi.bye:beatles:jar:1.6:compile service: ServiceOne
hi.bye:beatles:jar:1.5:compile service: ServiceTwo
hi.bye:beatles:jar:1.15:compile service: ServiceThree
@
如果您注意到:版本号有点在每个依赖块中从最高到最低排序。我正在尝试编写一个awk 脚本,它将各自块中的每一行从最高版本号排序到最低版本号。输出应该是这样的:
foo.bar.baz:json:jar:2.2.10:compile service: ServiceThree
foo.bar.baz:json:jar:2.2.2:compile service: ServiceTwo
@
asm:asm:jar:3.3.1:compile service: ServiceOne
asm:asm:jar:3.3.1:compile service: ServiceTwo
asm:asm:jar:3.3.0:compile service: ServiceThree
@
hi.bye:beatles:jar:1.15:compile service: ServiceThree
hi.bye:beatles:jar:1.6:compile service: ServiceOne
hi.bye:beatles:jar:1.5:compile service: ServiceTwo
@
注意:输出中的服务名称不需要按任何特定顺序排列。只要版本从大到小排序。
从逻辑上讲,我认为我应该设置RS="@" 并创建一个包含该块中每一行的数组,然后按版本号对这些数组进行排序并打印它们。问题是,我不知道如何按版本号对它们进行排序。这是我目前在awk 脚本中的内容:
BEGIN {
RS = "@";
}
{
split($0, lines, "\n");
# sort the array by the version number from highest to lowest
# <--- I need help here
for(key in lines) { print lines[key]; }
delete lines;
}
END {
}
如果这完全不符合标准,我愿意尝试新方法。任何有关此问题的帮助将不胜感激!
【问题讨论】: