Сортировка подполей и сохранение в массиве awk - PullRequest
0 голосов
/ 28 октября 2018

У меня есть и файл ввода выглядит следующим образом:

Objects (id: bounding-box centroid area mean-color): 
0: 800x800+0+0 406.6,390.9 378792 srgb(0,0,0) 
11: 240x151+140+624 259.5,699.0 36240 srgb(255,255,255) 
 6: 240x151+462+176 581.5,251.0 36240 srgb(255,255,255) 
 7: 240x151+87+257 206.5,332.0 36240 srgb(255,255,255) 
 8: 240x151+366+355 485.5,430.0 36240 srgb(255,255,255) 
 9: 240x151+77+448 196.5,523.0 36240 srgb(255,255,255) 
 10: 240x151+468+542 587.5,617.0 36240 srgb(255,255,255) 
 2: 178x59+223+65 311.5,94.0 10502 srgb(255,255,255) 
 3: 178x59+417+65 505.5,94.0 10502 srgb(255,255,255) 
 4: 178x59+611+65 699.5,94.0 10502 srgb(255,255,255) 
1: 178x59+29+65 117.5,94.0 10502 srgb(255,255,255) 
5: 110x16+255+63 309.5,182.5 1760 srgb(255,255,255)   

Меня интересует второе поле, например, 2-й элемент второго поля - «240x151 + 140 + 624».Если мы используем в качестве разделителя полей «+» для этого второго поля, тогда будет 3 поля в исходном 2-м поле.Я хочу иметь и массив awk (в данном случае массив "a") с этим вторым полем, отсортированным сначала по 3-му подполю, а затем по второму подполю (где новый FS = "+").

Я делаю это с помощью приведенного ниже кода, и он работает, но мне нужна сначала программа awk, затем труба для сортировки, затем труба снова для второй программы awk.

 awk 'NR>2{print $2}' file | 
 sort -t "+" -k3n -k2n |  
 awk '{a[NR]=$0} END{
  for (i=1;i<=length(a);i++) print a[i] }' 
 110x16+255+63 
 178x59+29+65 
 178x59+223+65 
 178x59+417+65 
 178x59+611+65 
 240x151+462+176  
 240x151+87+257 
 240x151+366+355  
 240x151+77+448  
 240x151+468+542 
 240x151+140+624 

Как получить отсортированный массив «a» в одной awk-программе (без конвейера дважды), чтобы иметь возможность выполнять дальнейшую обработку в блоке END {}?

Заранее спасибо

1 Ответ

0 голосов
/ 28 октября 2018

Вот один для GNU awk Использование предопределенных заказов на сканирование массива с gawk :

$ awk '
{
    split($2,t,"+")                       # split $2 to tmp on +
    a[t[3]][t[2]][NR]=$2                  # most controlling key is the first...
}                                         # etc, NR to make it unique
END {
    PROCINFO["sorted_in"]="@ind_num_asc"  # scanning order, see the link
    for(i in a)
        for(j in a[i])
            for(k in a[i][j])
                print a[i][j][k]
}' file

Вывод:

(id:
800x800+0+0
110x16+255+63
178x59+29+65
178x59+223+65
178x59+417+65
178x59+611+65
240x151+462+176
240x151+87+257
240x151+366+355
240x151+77+448
240x151+468+542
240x151+140+624

Редактировать : Это может быть излишним, это может также сработать, но слишком рано утром, чтобы принять это решение или сделать тесты.Если вы все же протестируете его, дайте нам знать, что мы все-таки сообщество:

$ awk '
{
    split($2,t,"+")                       # for example: 240x151+140+624
    a[t[3] "+" t[2] "+" NR]=$2            # key: t["624+140+3"]=240x151+140+624
}
END {
    PROCINFO["sorted_in"]="@ind_num_asc"
    for(i in a)
        print a[i]
}' file

Вывод выглядит [ed] одинаково:

- - 

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