awk

Sort Array Values using asort

asort函数排序数组值,并存储他们在索引1到n里面。n是数组里总的元素个数。

假设数组里,你有两个元素:time[“something”]=“B-I’m big b”和 item[“notsure”]=“A-I’m big a”。之后调用一个asort函数,数组将基于值排序:item[1]=“A-I’m big a ”和item[2]=“B-I’m big b”。

在下面的例子中,我们有各种非连续的数字和字符串数组索引。asort后,数组将被排序并存储在索引1,2,3,4,… 请注意asort返回数组中的项目总数。

$ cat asort.awk
BEGIN {
    item[101]="HD Camcorder";
    item[102]="Refrigerator";
    item[103]="MP3 Player";
    item[104]="Tennis Racket";
    item[105]="Laser printer";
    item[1001]="Tennis Ball";
    item[55]="Laptop";
    item["na"]="Not Available";

    print "--------Before asort--------"
    for ( x in item)
        print "Index",x,"contains",item[x];
        total=asort(item);
    print "--------After asort--------"
    for ( x in item )
        print "Index",x,"contains",item[x];
        print "Return Value from asort:",total;
    }

$ awk -f asort.awk
--------Before asort--------
Index 55 contains Laptop
Index 101 contains HD Camcorder
Index 102 contains Refrigerator
Index 103 contains MP3 Player
Index 104 contains Tennis Racket
Index 105 contains Laser printer
Index na contains Not Available
Index 1001 contains Tennis Ball
--------After asort--------
Index 4 contains MP3 Player
Index 5 contains Not Available
Index 6 contains Refrigerator
Index 7 contains Tennis Ball
Index 8 contains Tennis Racket
Index 1 contains HD Camcorder
Index 2 contains Laptop
Index 3 contains Laser printer
Return Value from asort: 8

在上面的例子中,asort后,数组元素没有从索引1到索引8打印。相反,它是随机的。你可以打印他们从索引1到索引8如下面的例子所示。

$ cat asort1.awk
BEGIN {
    item[101]="HD Camcorder";
    item[102]="Refrigerator";
    item[103]="MP3 Player";
    item[104]="Tennis Racket";
    item[105]="Laser printer";
    item[1001]="Tennis Ball";
    item[55]="Laptop";
    item["na"]="Not Available";

    total = asort(item)
    for (i=1;i<=total;i++)
        print "Index",i,"contains",item[i];
    }

$ awk -f asort1.awk
Index 1 contains HD Camcorder
Index 2 contains Laptop
Index 3 contains Laser printer
Index 4 contains MP3 Player
Index 5 contains Not Available
Index 6 contains Refrigerator
Index 7 contains Tennis Ball
Index 8 contains Tennis Racket

在上面的例子中,你可能已经注意到,一旦asort被执行,你将永远失去原来索引。因此,新的索引代替覆盖原数组,你可能希望用新索引创建一个新数组。

在下面的例子里,原数组item没有被修改。取而代之,itemnew数据将包含新索引。比如itemnew[1],itemnew[2],itemnew[3],等。


total=asort(item,itemnew)

再次请记住asort排序数组值。它用新索引从1到n代替原索引,原索引丢失。