数字和字符串值的多级排序

时间:2019-02-18 05:31:22

标签: sorting awk

我想对以下数据使用awk对浮点值进行多级排序:

store:LA----------------400.68  
----pens----------------200.34  
--------reynolds--------110.34  
--------butterflow------90.00  
--------trimex----------NA  
----copies--------------110.34  
--------classmate-------110.34  
----pencil--------------90.00  
--------HB--------------44.5  
--------classmate-------45.5  

数值是可用库存量。

排序后的结果应类似于:

store:LA----------------400.68  
----pencil--------------90.00 
--------HB--------------44.5  
--------classmate-------45.5  
----copies--------------110.34  
--------classmate-------110.34  
----pens----------------200.34  
--------butterflow------90.00  
--------reynolds--------110.34  
--------trimex----------NA  

首先基于产品的升序排列,最后基于具有NA值的品牌的产品。

我尝试首先针对商店(因为有多个商店)选择$2的值,然后将产品的价值附加在商店的价值之后,最后附加品牌的价值,并将其存储在数组。
它看起来像:

400.68
400.68:200.34
400.68:200.34:110.34
400.68:200.34:90.00
400.68:200.34:NA

在此数组上使用asort不会显示所需的结果:

{
      match($0, /^ */);
      offset = RLENGTH;
      if (offset == 1) { items[NR] = $2 }
      else if (offset > prev_ofst) { items[NR] = items[NR-1]":"$2 } 

      else if (offset < prev_ofst) {
         prev_item = items[NR-1];
         gsub("(\\:[^:]+\\:[^:]+)$", "", prev_item);
         items[NR] = prev_item":"$2;
      }
      else {
         prev_item = items[NR-1];
         gsub("(\\:[^:]+)$", "", prev_item);
         items[NR] = prev_item" "$2;
      }
      prev_ofst = offset;
      print items[NR];
}

END{
      asort(items);
      for (i = 1; i <= NR; i++) {
          gsub("[^:]+\\:", "", items[i]);
          print items[i];
      }
}

1 个答案:

答案 0 :(得分:1)

目前尚不清楚in product based on the brand with NA value in the last.是什么意思(您是根据样本输入中没有NA值的品牌进行排序,还是根据每行有NA的末尾数字进行排序?值?),但是假设您在发布的预期输出中以错误的顺序排列了“铅笔”和“副本”,这是我想使用GNU awk(您已经在{{ 1}})用于多维数组和sorted_in:

asort()