我的内容形式是在该内容的基础上给出标题。
我需要对标题进行排序,但基础内容将独立排序,而不是标题为单位。
我可以做的一个方法是grep所有标题对那些飞行进行排序并将标题和下面的行没有粘贴到新文件中。
但我想要一些有效的方法来做到这一点。请提出一些方法。下面给出了内容样本(货币是标题,下面给出的是该货币的序列号)
C01
====
892341231,786754321,1234567
C05
====
78675433432, 1245673234
答案 0 :(得分:1)
Unix sort
命令处理单行数据。如评论中所述,一种选择是将数据转换为每种货币的单行,使用sort
,然后解开复合线:
sed -e 'N;N;N;s/\n/ /g' data | sort | perl -p -e 's/ (=+) /\n$1\n/; s/ $/\n/;'
sed
证明了将新行添加到字符串中的顽固性,所以我使用perl
代替。当然,如果你完全使用perl
,你可以在perl
完成整个工作。这是详细版本,是sed
和sort
部分的相当直接的音译,除了不需要删除换行符,这简化了排序后的打印:
#!/usr/bin/env perl
use strict;
use warnings;
my @currencies;
while (<>)
{
my $l2 = <>;
my $l3 = <>;
my $l4 = <>;
push @currencies, "$_$l2$l3$l4";
}
print foreach (sort @currencies);
给定输入文件:
C01
====
892341231,786754321,1234567
C05
====
78675433432,1245673234
C02
====
444341231,333754321,2224567
两个脚本都产生输出:
C01
====
892341231,786754321,1234567
C02
====
444341231,333754321,2224567
C05
====
78675433432,1245673234
这是Perl,因此不止一种方法(TMTOWTDI)和其他方式使用较少的暴力,并且比一次读取4行更不易碎。例如,您可以将行分隔符设置为""
以强制段落模式,因此输入的每个“行”都是一个段落,由一个或多个空行分隔。
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = "";
my @currencies = <>;
print foreach (sort @currencies);
当然,即使这有点冗长。我们不使用显式数组,因此我们不需要use strict;
,我们可以将它减少到:
local $/ = "";
print foreach (sort <>);
或者你可以添加一个shebang系列:
#!/usr/bin/perl -w
local $/ = "";
print foreach (sort <>);