Сортировка значений в массиве с помощью awk

#awk #gawk

#awk #gawk

Вопрос:

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

Однако я бы хотел, чтобы пути к файлам были отсортированы в алфавитно-цифровом порядке. Я пытался использовать print owner | "sort" , но результат выглядит странно.

Я передаю это в скрипт: svnadmin lslocks $SVN_REPO /Trunk | locks.awk

 #!/bin/gawk
BEGIN {
    # RS="" means "record separator is a blank line"
    RS=""
    FS="n"
    counter=0
    # number of days (seconds) for an old lock
    THRESHOLD_DAYS      =   7
    THRESHOLD_SECONDS   =   60 * 60 * 24 * THRESHOLD_DAYS
    # seconds of right now
    NOW_SECONDS         =   systime()
}

# This code is processed FOR EACH line of input
{
    FILE_PATH       =   gensub(/Path: ([[:print:]] ).*/, "\1", "g", $1)
    #UUID_TOKEN      =   $2
    OWNER           =   gensub(/Owner: ([[:alnum:]] ).*/, "\1", "g", $3)
    #LOCK_CREATED    =   $4
    #EXPIRES         =   $5
    #COMMENT         =   $6

    # skip if owner matches regex
    if (OWNER ~ /kerri|jon|brian|andy|steve|andrew|matthew.nolan|devel|wayne|matty/ ||
        FILE_PATH ~ /UFT//){
        next
    }

    # get only the timestamp
    # e.g. 2014-04-14 14:09:10
    LOCK_STAMP      =   gensub(/Created: ([[:graph:]]  [[:graph:]] ) .*/, "\1", "g", LOCK_CREATED)

    # mktime expected syntax: "YYYY MM DD HH MM SS [DST]"
    LOCK_SECONDS    =   gensub(/[-:]/," ","g", LOCK_STAMP)

    # if NOW minus LOCK is greater than THRESHOLD :: the lock is old
    if ( (NOW_SECONDS - LOCK_SECONDS) > THRESHOLD_SECONDS ){
        # use the spaces character for string concatenation
        # LOCKS[OWNER]    =   LOCKS[OWNER] "nt" FILE_PATH
        LOCKS[OWNER]    =   FILE_PATH "n" LOCKS[OWNER]
    }

      counter
}

END {
    for (i in LOCKS){
        print i
        printf "%s", LOCKS[i] | "sort"
        # MESSAGE = i_OWNER ": you are holding locks on the following files:" LOCKS[i_OWNER]
        # print MESSAGE | "mutt -s '" i_OWNER ": You have old locks in SVN repository' " i_OWNER "@example.com.au"
    }
}
  

Пример ввода

 Path: /Trunk/Lettus/UFT/30-order-and-invoice/default.cfg
UUID Token: opaquelocktoken:703b9c76-a0c6-4ecd-9078-878382e03572
Owner: matty
Created: 2014-05-22 14:36:14  1000 (Thu, 22 May 2014)
Expires:
Comment (1 line):


Path: /Trunk/Scanner/Lettus_V2_IntermecVersion/LettusMobile/bin/Release/LettusMobile/Intermec.DataCollection.CF2.xml
UUID Token: opaquelocktoken:4fec94d3-4a19-4366-9efb-c814152a167b
Owner: felipe
Created: 2014-05-28 12:14:56  1000 (Wed, 28 May 2014)
Expires:
Comment (1 line):


Path: /Trunk/Lettus/UFT/00-lettus-common/Action0/ObjectRepository.bdb
UUID Token: opaquelocktoken:bec7866a-2f39-4a6d-b2fd-4b47ef3cdece
Owner: matty
Created: 2014-05-22 14:36:15  1000 (Thu, 22 May 2014)
Expires:
Comment (1 line):


Path: /Trunk/Lettus/UFT/30-order-and-invoice/Action2/Resource.mtr
UUID Token: opaquelocktoken:0d1234a3-8a1f-434e-91e8-03315e64b085
Owner: matty
Created: 2014-05-22 14:36:17  1000 (Thu, 22 May 2014)
Expires:
Comment (1 line):


Path: /Trunk/Lettus/UFT/30-order-and-invoice/Default.xls
UUID Token: opaquelocktoken:28f63d50-3280-4f90-b552-5f297ab8c973
Owner: matty
Created: 2014-05-22 14:36:15  1000 (Thu, 22 May 2014)
Expires:
Comment (1 line):


Path: /Documents/Software/JDeveloper/oneNote/JDeveloperNotebook/Things to Remember.one
UUID Token: opaquelocktoken:5236cfdf-ab7e-4336-a7b8-98e6db221286
Owner: wayne
Created: 2014-03-14 14:10:40  1000 (Fri, 14 Mar 2014)
Expires:
Comment (1 line):
  

Желаемый результат

 wayne
/Trunk/aaa
/Trunk/file1
/Trunk/file2
/Trunk/zzz

matty
/Trunk/bbb
/Trunk/file3
/Trunk/file4
/Trunk/zzzzzz
  

и так далее.

Они будут отправлены пользователям по электронной почте (например), как вы можете видеть в нижней части моего примера скрипта выше. mutt

Комментарии:

1. Пожалуйста, добавьте пример ввода и желаемый результат

2. БЛОКИРОВКИ [ВЛАДЕЛЕЦ] должны быть массивом, и вы должны вызывать asort массив. Google «сортировка awk»

3. Как мы получаем желаемый результат из образца ввода? Я не вижу появления aaa или zzz во входных данных, так как же они появились на выходе? Я вижу пользователя felipe во входных данных (а также Уэйна и Мэтти). Во входных данных я вижу 4 файла для Мэтти и по одному для Уэйна и Фелипе. Как это связано с выводом образца? Если ответ «не связан», пожалуйста, укажите соответствующий желаемый результат для образца входных данных, потому что трудно понять, что требуется в противном случае. Кроме того, Уэйн был указан перед мэтти; это обратный алфавитный порядок имени пользователя или какой-либо другой критерий сортировки.

4. Извините, вывод не соответствует вводу, но я показал желаемый формат вывода. Для каждого «владельца» мне нужен отсортированный список файлов от А доЯ

Ответ №1:

Вы просто не закрываете сопроцесс: ему нужно сообщить, что у него есть все входные данные, которые он собирается получить:

 for (owner in LOCKS){
    print owner
    printf "%s", LOCKS[owner] | "sort"
    close("sort")
}
  

См. http://www.gnu.org/software/gawk/manual/html_node/Redirection.html
и http://www.gnu.org/software/gawk/manual/html_node/Close-Files-And-Pipes.html