Сортировка строк в блоках в Awk - PullRequest
0 голосов
/ 18 мая 2018

У меня есть очень длинный файл, который содержит список зависимостей, их версии и сервис, которому принадлежит зависимость.Этот файл отсортирован и разделен по блокам.

Вот фрагмент из файла, к которому я обращаюсь:

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 {
}

Если это не так, я открыт для новых подходов.Любая помощь с этим вопросом будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

С сортировкой 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
@
0 голосов
/ 18 мая 2018

вот еще один awk

$ awk '/^@/{close(cmd); print; next} 
           {cmd="sort -rV"; print | cmd}' file

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
@
0 голосов
/ 18 мая 2018

Использование GNU awk:

$ awk '
BEGIN {
    FS=":"
    PROCINFO["sorted_in"]="@ind_num_desc"  # for array processes order
}
$0=="@" {                                  # at the end of a block
    for(i in a)                            # order every array dimension
        for(j in a[i])
            for(k in a[i][j])
                for(l in a[i][j][k])
                    print a[i][j][k][l]    # output
     print "@"                             # block separator
     delete a                              # delete array 
     next                                  # skip to next block
}
{
     split($4,b,".")                       # separate version depths
     a[b[1]][b[2]][b[3]][--c]=$0           # hash to a
}' file
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
@

То, что должно было быть быстрой и красивой прогулкой по парку, оказалось отвратительным взломом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...