awk - 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
解决方案
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
推荐阅读
- javascript - 如何在 Reactjs 中正确地将商品添加到购物车?
- javascript - 谷歌地球引擎 Python API,图像 .and(image2) 函数
- javascript - 带有枚举的 Angular 接口
- java - 我有两个hashmap HashMap
> 在这种格式下,如何比较两个值是否相同或不同的键 - c - 在什么时候库函数的效率不值得调用它们的开销?
- list - 在 prolog 中绑定一个列表
- process - 了解 waitpid 如何处理信号
- javascript - 为什么这个表单提交两次
- javascript - 从 div 和 textarea 中删除图像
- graphql - 如何在 Hotchocolate 10.4.3 中设置执行超时