如何将包含两个集合的文件排序为 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
经过快速研究这个问题,我找到了以下解决方案:
- 将文件分成两半,然后尝试分别对它们进行排序
这在这里不是首选,因为我需要收集这些结果
来自 1000 多个文件。
- 使用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
我在一个文本文件中有 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
经过快速研究这个问题,我找到了以下解决方案:
- 将文件分成两半,然后尝试分别对它们进行排序 这在这里不是首选,因为我需要收集这些结果 来自 1000 多个文件。
- 使用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