gpt4 book ai didi

arrays - 在 awk 中对 block 内的行进行排序

转载 作者:行者123 更新时间:2023-12-02 03:13:05 25 4
gpt4 key购买 nike

我有一个很长的文件,其中包含依赖项列表、它们的版本以及依赖项所属的服务。该文件按 block 排序和分隔。

这是我引用的文件中的一个片段:

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
@

如果您会注意到:每个依赖项 block 中的版本号在某种程度上是从最高到最低排序的。我正在尝试编写一个 awk 脚本,它将对各自 block 中的每一行从最高版本号到最低版本号进行排序。输出应如下所示:

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="@" 并创建一个包含该 block 中每一行的数组,然后按版本号对这些数组进行排序并打印它们。问题是,我不知道如何按版本号对它们进行排序。以下是我的 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 {
}

如果这是完全错误的,我愿意尝试新方法。任何有关此问题的帮助将不胜感激!

最佳答案

使用 GNU 排序进行版本排序:

$ awk -F':' -v OFS='\t' 'NF==1{c++} {print c+1, $4, $0}' file  | sort -k1n -k2rV | cut -f3-
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: ServiceTwo
asm:asm:jar:3.3.1:compile service: ServiceOne
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
@

关于arrays - 在 awk 中对 block 内的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50415963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com