1

介绍

考虑以下示例sort.awk

BEGIN {
    a[1]="5"; 
    a[2]="3";
    a[3]="6";

    asort(a)
    for (i=1; i<=3; i++) print a[i]
}

运行 with以升序awk -f sort.awk打印数组中的排序数字:a

3
5
6

问题

考虑两个(通常是 for N)对应数组的扩展情况ab

a[1]="5"; b[1]="fifth"
a[2]="3"; b[2]="third"
a[3]="6"; b[3]="sixth"

以及“同时”对所有数组进行排序的问题。为了实现这一点,我需要对数组进行排序a,还需要获得排序的索引。对于这种简单的情况,索引将由下式给出

ind[1]=2; ind[2]=1; ind[3]=3;

有了这些索引,我就可以b根据 array 的排序结果打印出排序后的数组a。例如:

for (i=1;i<=3;i++) print a[ind[i]], b[ind[i]]

将打印排序后的数组..

另请参见使用 AWK 对关联数组进行排序

4

2 回答 2

2

我想出了两种方法来做你的“同时”排序。

  • 一种是组合两个数组然后排序。当您只需要输出时,这很有用。

  • 另一个是使用 gawk 的asorti()

详细阅读代码,我认为很容易理解:

BEGIN{
    a[1]="5"; b[1]="fifth"
    a[2]="3"; b[2]="third"
    a[3]="6"; b[3]="sixth"

    #method 1: combine the two arrays before sort
    for(;++i<=3;)
        n[i] = a[i]" "b[i]
    asort(n)
    print "--- method 1: ---"
    for(i=0;++i<=3;)
        print n[i]

    #method 2:
    #here we build a new array/hastable, and use asorti()
    for(i=0;++i<=3;)
        x[a[i]]=b[i]

    asorti(x,t)
    print "--- method 2: ---"
    for(i=0;++i<=3;)
        print t[i],x[t[i]]
}

输出:

kent$  awk -f sort.awk
--- method 1: ---
3 third
5 fifth
6 sixth
--- method 2: ---
3 third
5 fifth
6 sixth

编辑

如果要获取原始索引,可以尝试以下方法3:

#method 3: 
print "--- method 3: ---"
for(i=0;++i<=3;)
    c[a[i]] = i;

asort(a)
for(i=0;++i<=3;)
    print a[i], " | related element in b: "b[c[a[i]]], " | original idx: " c[a[i]] 

输出是:

--- method 3: ---
3  | related element in b: third  | original idx: 2
5  | related element in b: fifth  | original idx: 1
6  | related element in b: sixth  | original idx: 3

你可以看到,原来的 idx 在那里。如果要将它们保存到数组中,只需添加idx[i]=c[a[i]]for 循环。

编辑2

方法4:以不同的顺序组合,然后拆分得到idx数组:

#method 4:

for(i=0;++i<=3;)
    m[i] = a[i]"\x99"i 
asort(m)
print "--- method 4: ---"
for(i=0;++i<=3;){
    split(m[i],x,"\x99")
    ind[i]=x[2]
    }

#test ind array:
for(i=0;++i<=3;)
    print i"->"ind[i]

输出:

--- method 4: ---
1->2
2->1
3->3
于 2013-06-06T23:01:23.247 回答
0

根据Kents 回答,这是一个还应该获得索引的解决方案:

BEGIN {
    a[1]="5";
    a[2]="3";
    a[3]="6";

    for (i=1; i<=3; i++) b[i]=a[i]" "i
    asort(b)
    for (i=1; i<=3; i++) {
      split(b[i],c," ")
      ind[i]=c[2]
    }
    for (i=1; i<=3; i++) print ind[i]
}
于 2013-06-06T23:21:36.360 回答