You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell环境下基于NULL分隔的三元组分组排序方案求助

按NULL分隔的三元组分组排序方案

由于sort命令仅支持单字符分隔符,且无法直接按3个实体为一组进行排序,可借助awk或perl实现需求,以下是具体方案:

核心思路

  1. 将输入按每3个NULL分隔的实体划分为一组
  2. 提取每组的排序键(如示例中的第一个实体、典型数据中的size字段)
  3. 对所有组按排序键排序
  4. 输出排序后的组,保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:35