注意:补充问题在这里:如何对用标题分隔的多个“块”内的行分别进行排序?
因此,我确实找到了一个答案,即如何按字母顺序对文本文件中的行进行排序。但这并不是我需要做的。我有这个文件,其中包含 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.txt
,sed …
整个命令在哪里。
流程如下:
sed
[
在行首的每个字符前插入一个空字符,除非该行是第一行。这样,空字符就可以分隔配置文件。sort -z
使用这些空字符作为分隔符,因此它对整个配置文件进行排序,而不是单独的行。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
怎么运行的
- 它读取输入文件(
while (<>)
)。 - 对于输入文件中的每个配置文件
[profile]
,它会在变量中记住其名称$profile
。 - 它将配置文件标题后面的每一行保存在一个数组中。
- 然后对哈希的键进行排序
%profiles
。 - 它还对数组内的行进行排序。
在此脚本中,%profiles
是一个哈希。它的键是配置文件名称,其值为线阵列.
因此是在变量@{ $profiles{$profile} }
中存储配置文件名称行的数组。$profile