Shell环境下基于NULL分隔的三元组分组排序方案求助
按NULL分隔的三元组分组排序方案
由于sort命令仅支持单字符分隔符,且无法直接按3个实体为一组进行排序,可借助awk或perl实现需求,以下是具体方案:
核心思路
- 将输入按每3个NULL分隔的实体划分为一组
- 提取每组的排序键(如示例中的第一个实体、典型数据中的
size字段) - 对所有组按排序键排序
- 输出排序后的组,保持NULL分隔的格式
Perl实现(简洁高效)
字符串排序(适用于示例场景)
perl -0 -ne ' push @groups, $1 while /([^\0]*\0[^\0]*\0[^\0]*)\0/g; @sorted = sort { ($a =~ /^([^\0]*)/)[0] cmp ($b =~ /^([^\0]*)/)[0] } @groups; print join "\0", @sorted, ""; ' < input_file
数值排序(适用于按文件大小排序的典型场景)
如果size是数值类型,需用数值比较替代字符串比较,避免"100"排在"20"前的问题:
perl -0 -ne ' push @groups, $1 while /([^\0]*\0[^\0]*\0[^\0]*)\0/g; @sorted = sort { ($a =~ /^([^\0]*)/)[0] <=> ($b =~ /^([^\0]*)/)[0] } @groups; print join "\0", @sorted, ""; ' < input_file
Awk实现
awk -v RS='\0' ' { # 每3个NULL分隔的实体组成一组 if ((NR-1) % 3 == 0) { group_idx = ++count group_key[group_idx] = $0 group_content[group_idx] = $0 } else { group_content[group_idx] = group_content[group_idx] "\0" $0 } } END { # 按组的第一个字段排序(字符串顺序) PROCINFO["sorted_in"] = "@ind_str_asc" for (i in group_key) { printf "%s\0", group_content[i] } } ' < input_file
方案说明
-0选项:将Perl的输入记录分隔符设为NULL,适配NULL分隔的输入格式- 正则
([^\0]*\0[^\0]*\0[^\0]*)\0:精准匹配每组实体1\0实体2\0实体3\0的结构 - 排序逻辑:通过提取每组第一个实体作为排序键,实现按组排序的需求
内容的提问来源于stack exchange,提问作者TheBigBadBoy
相关产品推荐
相关产品推荐

