【问题标题】:AWK sort array of strings by string lengthAWK 按字符串长度对字符串数组进行排序
【发布时间】:2016-04-23 09:52:15
【问题描述】:

数组是从 split() 中获得的; x=split(A,B)。 我需要按字符串的长度对数组进行排序,从小到大。

当前订单:

B[1]=alnis;
B[2]=nis;
B[3]=connis

想要的顺序:

B[1]=nis;
B[2]=alnis;
B[3]=connis

我已经用 gawk 试过了,procinfo ["sorted in"] = "@ whatever .."。但我最大的收获是按字母顺序排序。

【问题讨论】:

    标签: arrays sorting awk gawk


    【解决方案1】:

    asort()的awk支持自定义比较功能,让你可以定义如何对数组进行排序。

    你需要一个自定义的“比较”功能,用这个比较功能做asort()。

    例如:

    kent$  cat f
    alnis nis connis
    
    kent$  awk ' function byLength(i1,v1,i2,v2){ return length(v1)-length(v2)}
    {x=split($0, a);asort(a,b,"byLength");for(i=1;i<=x;i++)print b[i]}' f
    nis
    alnis
    connis
    

    【讨论】:

      【解决方案2】:

      你可以像这样控制数组遍历的顺序:

      function cmp_len(i1, v1, i2, v2) {
          return length(v1) - length(v2)
      }
      
      BEGIN {
          b[1] = "alnis"
          b[2] = "nis"
          b[3] = "connis"
      
          PROCINFO["sorted_in"] = "cmp_len"
      
          for (i in b) {
              print b[i]
          }
      }
      

      我创建了自己的比较函数并将其名称分配给PROCINFO["sorted_in"] 以更改元素的遍历顺序。

      测试一下:

      $ awk -f script.awk
      nis
      alnis
      connis
      

      您也可以将此函数的名称作为第三个参数传递给asort,以便将排序后的值写入新数组:

      asort(b, sorted, "cmp_len")
      

      请注意,这会更改数组元素的索引,但不会更改for (i in sorted) 循环遍历它们的顺序。要以新顺序循环遍历结果,您需要使用“C 样式”循环或如上所述更改PROCINFO["sorted_in"]。

      【讨论】:

        【解决方案3】:

        使用排序装饰/取消装饰可能更容易

        $ echo -e "alnis\nnis\nconnis" | 
          while read -r a; do echo -e ${#a}'\t'$a; done | 
          sort -n | cut -f2
        
        nis
        alnis
        connis
        

        或者,与 awk 类似

        $ echo -e "alnis\nnis\nconnis" | 
          awk '{print length($0)"\t"$0}' | 
          sort -n | cut -f2
        

        【讨论】:

          猜你喜欢
          • 2016-02-09
          • 2015-01-16
          • 1970-01-01
          • 2021-03-16
          • 2013-12-03
          • 2011-03-11
          • 1970-01-01
          • 2017-07-19
          • 1970-01-01
          相关资源
          最近更新 更多