最近,我不得不根据记录的ID对几个文件进行排序;问题是可以有几种类型的记录,在每种类型中,我必须用于排序的字段都位于不同的位置.然而,由于key=value
struct ,这些字段很容易识别.要显示一般 struct 的简单示例,请执行以下操作:
fieldA=valueA|fieldB=valueB|recordType=A|id=2|fieldC=valueC
fieldD=valueD|recordType=B|id=1|fieldE=valueE
fieldF=valueF|fieldG=valueG|fieldH=valueH|recordType=C|id=3
我提出了一个管道,如下所示,它完成了这项工作:
awk -F'[|=]' '{for(i=1; i<=NF; i++) {if($i ~ "id") {i++; print $i"?"$0} }}' tester.txt | sort -n | awk -F'?' '{print $2}'
换言之,算法如下:
- 通过字段和键值分隔符(
|
和=
)拆分记录 - 遍历元素并搜索
id
键 - 打印下一个元素(
id
键的值)、分隔符和整行 - 按数字排序
- 删除前置标识符以保留记录的 struct
处理样本会得到以下输出:
fieldD=valueD|recordType=B|id=1|fieldE=valueE
fieldA=valueA|fieldB=valueB|recordType=A|id=2|fieldC=valueC
fieldF=valueF|fieldG=valueG|fieldH=valueH|recordType=C|id=3
但是,有没有一种方法可以使用单个awk
命令来完成此任务?