2级排序awk数组

时间:2018-10-29 19:19:20

标签: awk columnsorting

我在下面想要将此输入文件分为2级的字段分隔符ir“ +”下放置了此输入文件。首先按第三字段,然后按第二字段的升序。

输入

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

另一个使用GNU awk和asorti()的{​​{3}}的方法(不是很完美):

awk '
{
    split($0,f,"+")
    a[$0]=f[3]                    # a["110x16+255+63"] = 63
}
END {
    OFS=", "                      # for pretty output
    n=asorti(a,a,"@val_num_asc")  # NOTICE THE THIRD ARGUMENT, using asorti but "@val..."
    for (i=1;i<=n;i++)            # "@ind..." would sort using the index
        print i,a[i]              # I wrote a over old a but you could use b
}' file

输出:

1, 110x16+255+63
2, 178x59+417+65
3, 178x59+611+65
4, 178x59+29+65
5, 178x59+223+65
6, 240x151+462+176
7, 240x151+87+257
8, 240x151+366+355
9, 240x151+77+448
10, 240x151+468+542
11, 240x151+140+624

使用"@ind_num_asc"的顺序为:

1, 110x16+255+63
2, 178x59+223+65
3, 178x59+29+65
4, 178x59+417+65
5, 178x59+611+65
6, 240x151+140+624
7, 240x151+366+355
8, 240x151+462+176
9, 240x151+468+542
10, 240x151+77+448
11, 240x151+87+257