按字母顺序对行包进行排序

按字母顺序对行包进行排序

注意:补充问题在这里:如何对用标题分隔的多个“块”内的行分别进行排序?


因此,我确实找到了一个答案,即如何按字母顺序对文本文件中的行进行排序。但这并不是我需要做的。我有这个文件,其中包含 15 个不同参数的配置文件,该文件放入工作仪器中,并由机器读取以获取配置文件列表。

遗憾的是,这个文件的格式如下:

[ProfileB]
param1=z
param2=y
param3=x
[ProfileA]
param1=k
param2=l
param3=

我想按字母顺序对配置文件进行排序,但我需要它们与参数保持分组。上面的示例应按以下方式排序:

[ProfileA]
param1=k
param2=l
param3=
[ProfileB]
param1=z
param2=y
param3=x

我猜想可以使用固定数量的行(名称+参数)或使用字符“[”作为一组行开头的标识符。

但这超出了我的文本处理能力。我可以使用 Sublime Text、R 或 Linux 命令控制台。

答案1

这在我的 Debian 中有效:

sed '1 ! s/^\[/\x00\[/g' | sort -z | tr -d "\0"

要使用文件,请使用重定向,例如{ sed … ; } <input.txt >output.txtsed …整个命令在哪里。

流程如下:

  1. sed[在行首的每个字符前插入一个空字符,除非该行是第一行。这样,空字符就可以分隔配置文件。
  2. sort -z使用这些空字符作为分隔符,因此它对整个配置文件进行排序,而不是单独的行。
  3. tr删除空字符。

答案2

下面是一个可以完成这个工作的小型 Perl 脚本:

my %profiles;
my $profile;

while (<>) {
    if (/\[(.+)\]/) {
        $profile = $1;
        next;
    }
    next if !defined $profile;

    chop if /\n$/;
    push @{ $profiles{$profile} }, $_;
}

foreach my $key (sort keys %profiles) {
    print "[$key]\n";
    foreach my $line (sort @{ $profiles{$profile} }) {
        print "$line\n";
    }
}

sortProfiles.pl例如,将其保存到文件中并运行:

perl sortProfiles.pl <inputFile.txt >outputFile.txt

怎么运行的

  1. 它读取输入文件(while (<>))。
  2. 对于输入文件中的每个配置文件[profile],它会在变量中记住其名称$profile
  3. 它将配置文件标题后面的每一行保存在一个数组中。
  4. 然后对哈希的键进行排序%profiles
  5. 它还对数组内的行进行排序。

在此脚本中,%profiles是一个哈希。它的键是配置文件名称,其值为线阵列.
因此是在变量@{ $profiles{$profile} }中存储配置文件名称行的数组。$profile

相关内容