排序子字段并存储在数组awk中

时间:2018-10-28 04:42:22

标签: arrays sorting awk

我有一个这样的输入文件:

 pip install tensorflow --upgrade --force-reinstall

我对第二个字段感兴趣,例如,第二个字段的第二个元素是“ 240x151 + 140 + 624”。如果我们将第二个字段用作字段分隔符“ +”,则原始第二个字段中将有3个字段。我想要一个awk数组(在这种情况下为数组“ a”),该第二个字段首先按第三个子字段排序,然后按第二个子字段排序(其中,新的FS =“ +”)。

我正在使用下面的代码来做到这一点,它可以工作,但是我首先需要一个awk程序,然后需要管道进行排序,然后再次为第二个awk程序进行管道。

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)   

如何在单个awk程序中获得排序的数组“ a”(没有两次管道),以便能够在END {}块中进行进一步处理?

提前感谢

1 个答案:

答案 0 :(得分:2)

这里是GNU awk Using Predefined Array Scanning Orders with 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

输出外观相同:

- -