如何将包含两个集合的文件排序为 Linux shell 中按字母顺序排列的两个集合?

How to sort a file containing two sets into two alphabetically ordered sets in Linux shell?

我在一个文本文件中有 2 组相似的数据,我想按字母顺序对这些组的内容进行独立排序。以下文本块是文本文件的一部分,格式为name : value

set1 :
scripts : 1168
virt : 541
firmware : 15
init : 315
security : 1529

set2 :    
scripts : 873
init : 84
virt : 402
security : 1720
firmware : 6

我希望输出排序如下:

set1 :
firmware : 15
init : 315
scripts : 1168
security : 1529
virt : 541

set2 :    
firmware : 6
init : 84
scripts : 873
security : 1720
virt : 402

经过快速研究这个问题,我找到了以下解决方案:

  1. 将文件分成两半,然后尝试分别对它们进行排序 这在这里不是首选,因为我需要收集这些结果 来自 1000 多个文件。
  2. 使用Linux GNU sort 命令有点问题。它按字母顺序对两个集合进行排序,然后根据它们的 values 对相同的 names 进行排序。这意味着,使用 GNU sort,我将失去某些行的集合成员资格。

GNU sort 的结果是排序的,但在这个问题的上下文中是不正确的。

firmware : 15
firmware : 6
init : 315
init : 84
scripts : 1168
scripts : 873
security : 1529
security : 1720
set1 :
set2 :
virt : 402
virt : 541
BEGIN {
RS="set"
FS="\n"
}

{
# Skip empty sets
if ([=10=] == "") next

setname = "set"
print setname

i = 0
# Start at field 2 to skip first field which is part of "set" name
for (x=2; x<NF; x++) {
    # Ignore blank lines in set
    if ($x != "") {
        data[i] = $x
        i = i + 1
    }
}
n = asort(data)  # NOTE: asort indexes from 1
for (i=1; i<=n; i++) {
    print data[i]
}
delete data
}

运行以上基于OP输入:

awk -f sort.awk input.txt

set1 :
firmware : 15
init : 315
scripts : 1168
security : 1529
virt : 541
set2 :
firmware : 6
init : 84
scripts : 873
security : 1720
virt : 402