我想对如下数据使用awk对浮点值进行多级排序:
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 该数值是可用库存量。
排序结果应如下所示:
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的值(因为有多个商店),然后将产品的值添加到商店值之后,最后添加品牌的值,并将其存储在数组中。
它看起来像这样:
400.68
400.68:200.34
400.68:200.34:110.34
400.68:200.34:90.00
400.68:200.34:NA在此阵列上使用asort未显示所需的结果:
{
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];
}
}发布于 2019-02-18 14:03:42
还不清楚in product based on the brand with NA value in the last.是什么意思(您是根据样本输入中没有安娜值的品牌进行排序,还是根据每行末尾有安娜值的数字进行排序?),但是假设您在发布的预期输出中有“铅笔”和“副本”的错误顺序,这里有一种方法,我认为您可以使用GNU awk (已经在asort()中使用)对多维数组和sorted_in执行以下操作:
$ 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----------NAhttps://stackoverflow.com/questions/54740964
复制相似问题