使用awk对数组中的值进行排序

使用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"

这个脚本对我来说很好。它可以向一个或多个锁的所有者发送电子邮件,并向其显示其持有的锁的列表

但是,我希望文件路径按字母数字排序。我尝试使用
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] "\n\t" 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"
    }
}
样本输入 期望输出 等等


这些将通过(例如)管道发送到
mutt
发送给用户,正如您在上面的示例脚本底部附近看到的那样。

您只是没有关闭协进程:需要向它发出信号,表明它拥有将要获得的所有输入:

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


请添加示例输入和所需输出锁[OWNER]应该是一个数组,您应该在数组上调用
asort
。Google“sort awk”我们如何从示例输入中导出所需的输出?我在输入数据中没有看到aaa或zzz,那么它在输出中是如何出现的呢?我在输入中看到一个用户felipe(还有wayne和matty)。在输入中,我看到matty有4个文件,wayne和felipe各有一个。这与示例输出有什么关系?如果答案是“不相关”,请为样本输入数据提供相关的期望输出,因为很难知道需要什么。此外,韦恩在马蒂之前被列入名单;是用户名的逆字母顺序,还是其他排序标准。抱歉,输出与输入不匹配,但我显示了所需的输出格式。对于每个“所有者”,我想要一个文件a-Z的排序列表
wayne
/Trunk/aaa
/Trunk/file1
/Trunk/file2
/Trunk/zzz

matty
/Trunk/bbb
/Trunk/file3
/Trunk/file4
/Trunk/zzzzzz
for (owner in LOCKS){
    print owner
    printf "%s", LOCKS[owner] | "sort"
    close("sort")
}