当前位置: 首页 > 知识库问答 >
问题:

在awk中同时对多个数组进行排序

陈实
2023-03-14

介绍

考虑以下示例sort.awk

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

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

使用awk-fsort.awk运行以升序打印数组a中的排序数字:

3
5
6

问题

考虑两个(一般来说,对于< code>N)对应数组< code>a和< code>b的扩展情况

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

以及“同时”排序所有数组的问题..为了实现这一点,我需要对数组< code>a进行排序,还需要获取排序的索引。对于这个简单的例子,指数由下式给出

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

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

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

将打印排序的数组。。

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

共有2个答案

秦哲瀚
2023-03-14

根据肯特的回答,这里有一个也应该获得索引的解决方案:

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]
}
秦承允
2023-03-14

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

>

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

    另一个是使用gawk的< code>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就在那里。如果要将它们保存到数组中,只需在for循环中添加idx[i]=c[a[i]]即可。

    编辑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
    

  •  类似资料:
    • 问题内容: 所以我正在制作一个需要处理多个数组的程序。有没有办法对所有这些数组进行排序以反映一个数组的排序?这些值在所有三个数组中都位于相同的索引位置,需要在排序后保持相同的索引值 例: 我有三个数组: 有什么方法可以对距离数组进行排序,然后将该排序反映给其他数组。因此,如果按名称排序并且Jane变为0,则其他数组中相同位置的其他值也将移至0。我该怎么办? 问题答案: 更好/面向对象的方法可能是让

    • 因此,我试图学习如何为类项目排序数组。我想知道如何对一个数组进行排序,从而对另一个数组进行排序。在下面的代码中,我可以对年份数组进行排序,但我如何才能使更改这一数组将名称和艺术家数组都更改为它们排列的数组呢?此外,如果你有任何建议,让代码对眼睛不那么苛刻,请告诉我,我正在努力掌握这个概念。

    • 问题内容: 我试图通过多个键对多维数组进行排序,但我不知道从哪里开始。我看了uasort,但不确定如何根据需要编写函数。 我需要按状态排序,然后按event_type排序,然后按日期排序。 我的数组如下所示: 问题答案: 你需要 从PHP 5.5.0开始: 就是现在:

    • 问题内容: 我已将CSV数据加载到多维数组中。这样,每个“行”都是一条记录,每个“列”都包含相同类型的数据。我正在使用下面的功能加载我的CSV文件。 我需要能够指定要排序的列,以便重新排列行。其中一列包含格式为的日期信息,我希望能够以最新日期为第一行进行排序。 问题答案: 您可以使用array_multisort() 尝试这样的事情: 对于PHP> = 5.5.0,只需提取列进行排序即可。无需循环

    • 本文向大家介绍PHP使用array_multisort对多个数组或多维数组进行排序,包括了PHP使用array_multisort对多个数组或多维数组进行排序的使用技巧和注意事项,需要的朋友参考一下 PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 关联(string)键名保持不变,但数字键名会被重新索引。 输入数组被当成一个表的列并以

    • 问题内容: 请原谅我这是多余的还是超基本的。我要从R进入Python / Numpy,并且很难在脑海里翻转事物。 我有一个维数组,我想使用索引值的另一个n维数组进行排序。我知道我可以将其包装成一个循环,但是似乎应该有一种非常简洁的Numpyonic方式将其击败并提交。这是设置n = 2的问题的示例代码: 所以现在我有一个2 x 5的随机数数组和2 x 5的索引。我已经阅读了约10次帮助,但显然我的