首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数值和字符串值的多级排序

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

Stack Overflow用户
提问于 2019-02-18 13:31:22
回答 1查看 46关注 0票数 0

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

代码语言:javascript
复制
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  

该数值是可用库存量。

排序结果应如下所示:

代码语言:javascript
复制
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的值(因为有多个商店),然后将产品的值添加到商店值之后,最后添加品牌的值,并将其存储在数组中。

它看起来像这样:

代码语言:javascript
复制
400.68
400.68:200.34
400.68:200.34:110.34
400.68:200.34:90.00
400.68:200.34:NA

在此阵列上使用asort未显示所需的结果:

代码语言:javascript
复制
{
      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];
      }
}
EN

回答 1

Stack Overflow用户

发布于 2019-02-18 14:03:42

还不清楚in product based on the brand with NA value in the last.是什么意思(您是根据样本输入中没有安娜值的品牌进行排序,还是根据每行末尾有安娜值的数字进行排序?),但是假设您在发布的预期输出中有“铅笔”和“副本”的错误顺序,这里有一种方法,我认为您可以使用GNU awk (已经在asort()中使用)对多维数组和sorted_in执行以下操作:

代码语言:javascript
复制
$ cat tst.awk
match($0,/^(-*)([^-]+)(-+)([^-]+)/,a) {
    offset = length(a[1])/4 + 1
    for (i=offset+1; i<=3; i++) {
        tags[i] = ""
    }
    tags[offset] = a[2]
    vals[tags[1]][tags[2]][tags[3]] = $0
}
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for ( tag1 in vals ) {
        for ( tag2 in vals[tag1] ) {
            for ( tag3 in vals[tag1][tag2] ) {
                print vals[tag1][tag2][tag3]
            }
        }
    }
}

$ awk -f tst.awk file
store:LA----------------400.68
----copies--------------110.34
--------classmate-------110.34
----pencil--------------90.00
--------HB--------------44.5
--------classmate-------45.5
----pens----------------200.34
--------butterflow------90.00
--------reynolds--------110.34
--------trimex----------NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54740964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档