首页 > 解决方案 > 2级排序awk数组

问题描述

我在下面有这个输入文件,我想在 2 级排序的字段分隔符 ir“+”。首先按第 3 场,然后按升序按第 2 场。

输入

240x151+140+624
240x151+462+176
240x151+87+257
240x151+366+355
240x151+77+448
240x151+468+542
178x59+223+65
178x59+417+65
178x59+611+65
178x59+29+65
110x16+255+63

到目前为止,我的代码如下,但输出不是我需要的。

awk '{split($0,f,"+")
      a[$0]=f[3];
     }END{
          n=asorti(a,b)
          for (i=1;i<=n;i++) 
          print b[i]}' file.txt
110x16+255+63
178x59+223+65
178x59+29+65
178x59+417+65
178x59+611+65
240x151+140+624
240x151+366+355
240x151+462+176
240x151+468+542
240x151+77+448
240x151+87+257

我想得到的预期输出如下所示,并且能够根据数字索引处理数组。

110x16+255+63  
178x59+29+65   
178x59+223+65  
178x59+417+65  
178x59+611+65  
240x151+462+176
240x151+87+257 
240x151+366+355
240x151+77+448 
240x151+468+542
240x151+140+624

标签: awkcolumnsorting

解决方案


sort是正确的工具

$ sort -t+ -k3n -k2,2n file

110x16+255+63
178x59+29+65
178x59+223+65
178x59+417+65
178x59+611+65
240x151+462+176
240x151+87+257
240x151+366+355
240x151+77+448
240x151+468+542
240x151+140+624

一种方法是awk通过组合第三个和第二个字段并按该键排序来创建一个新键。但请注意,数组索引将按非数字排序。因此,我们必须通过零填充将它们转换为文本排序的等效格式。假设最大数字有 5 位数字(如果没有相应更改)。

$ awk -F+ '{k1=sprintf("%05d",$3); k2=sprintf("%05d",$2); a[k1,k2]=$0}
       END {n=asorti(a,d); for(i=1;i<=n;i++) print a[d[i]]}' file

110x16+255+63
178x59+29+65
178x59+223+65
178x59+417+65
178x59+611+65
240x151+462+176
240x151+87+257
240x151+366+355
240x151+77+448
240x151+468+542
240x151+140+624

推荐阅读