Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何根据关键字进行排序?_Perl_Sorting_Sed_Awk - Fatal编程技术网

Perl 如何根据关键字进行排序?

Perl 如何根据关键字进行排序?,perl,sorting,sed,awk,Perl,Sorting,Sed,Awk,如何根据关键字进行排序?我有一个复杂的列表,不知道我是否能把它分类。以下是一个例子: enter code here Room Name: RM145 ,ID,user Name ,300,NOS ,100,NOT Room Name: RM370 ,ID,user Name ,300,NOS

如何根据关键字进行排序?我有一个复杂的列表,不知道我是否能把它分类。以下是一个例子:

enter code here Room Name: RM145 
                ,ID,user Name
                ,300,NOS
                ,100,NOT
                Room Name: RM370 
                ,ID,user Name
                ,300,NOS
                Room Name: RM471  
                ,ID,user Name
                ,300,POS
                ,100,NOT
                Room Name: RM349  
                ,ID,user Name
                ,301,NOS
                ,100,NOT
                ,500,COS
我的目标是根据“
房间名称”
”对该列表进行排序


我有纯文本和CSV文件。我不知道哪一个更容易分类。有人有什么建议吗?

假设您可以对文件进行格式化,使每个记录都位于自己的行中,那么使用
排序

$ cat ./infile
Room Name: RM145,ID,user Name,300,NOS,100,NOT
Room Name: RM370,ID,user Name,300,NOS
Room Name: RM471,ID,user Name,300,POS,100,NOT
Room Name: RM349,ID,user Name,301,NOS,100,NOT,500,COS

$ sort ./infile
Room Name: RM145,ID,user Name,300,NOS,100,NOT
Room Name: RM349,ID,user Name,301,NOS,100,NOT,500,COS
Room Name: RM370,ID,user Name,300,NOS
Room Name: RM471,ID,user Name,300,POS,100,NOT

假设您可以对文件进行格式化,使每个记录都位于自己的行上,那么使用
sort

$ cat ./infile
Room Name: RM145,ID,user Name,300,NOS,100,NOT
Room Name: RM370,ID,user Name,300,NOS
Room Name: RM471,ID,user Name,300,POS,100,NOT
Room Name: RM349,ID,user Name,301,NOS,100,NOT,500,COS

$ sort ./infile
Room Name: RM145,ID,user Name,300,NOS,100,NOT
Room Name: RM349,ID,user Name,301,NOS,100,NOT,500,COS
Room Name: RM370,ID,user Name,300,NOS
Room Name: RM471,ID,user Name,300,POS,100,NOT

假设排序键是房间名称,您可以执行以下操作:

#!/usr/bin/env perl
use strict;
use warnings;
my %room_by;
my $roomname;
while (<DATA>) {
    chomp;
    if ( m/Room Name:\s*(.+)/ ) {
        $roomname = $1;
        $room_by{$roomname} = ();
    }
    else {
        push @{$room_by{$roomname}}, $_;
    }
}
for $roomname (sort keys %room_by) {
    print "Room Name: $roomname\n";
    for my $content ( @{$room_by{$roomname}} ) {
        print "$content\n";
    }
}
__DATA__
Room Name: RM145 
,ID,user Name
,300,NOS
,100,NOT
Room Name: RM370 
,ID,user Name
,300,NOS
Room Name: RM471  
,ID,user Name
,300,POS
,100,NOT
Room Name: RM349  
,ID,user Name
,301,NOS
,100,NOT
,500,COS
#/usr/bin/env perl
严格使用;
使用警告;
我的%room_by;
我的$roomname;
而(){
咀嚼;
如果(m/房间名称:\s*(.+)/){
$roomname=$1;
$room_by{$roomname}=();
}
否则{
按{$roomname},$\;
}
}
对于$roomname(按%room\u排序键){
打印“房间名称:$roomname\n”;
对于我的$content(@{$room_by{$roomname}){
打印“$content\n”;
}
}
__资料__
房间名称:RM145
,ID,用户名
,300个
,100,不是
房间名称:370令吉
,ID,用户名
,300个
房间名称:471令吉
,ID,用户名
,300,位置
,100,不是
房间名称:349令吉
,ID,用户名
,301,第
,100,不是
,500,COS

这将在数组的散列中收集房间名称,其中散列键是房间名称,散列值是房间的内容。您还可以对散列值进行排序,以便对其进行排序。

假设排序键是房间名称,您可以执行以下操作:

#!/usr/bin/env perl
use strict;
use warnings;
my %room_by;
my $roomname;
while (<DATA>) {
    chomp;
    if ( m/Room Name:\s*(.+)/ ) {
        $roomname = $1;
        $room_by{$roomname} = ();
    }
    else {
        push @{$room_by{$roomname}}, $_;
    }
}
for $roomname (sort keys %room_by) {
    print "Room Name: $roomname\n";
    for my $content ( @{$room_by{$roomname}} ) {
        print "$content\n";
    }
}
__DATA__
Room Name: RM145 
,ID,user Name
,300,NOS
,100,NOT
Room Name: RM370 
,ID,user Name
,300,NOS
Room Name: RM471  
,ID,user Name
,300,POS
,100,NOT
Room Name: RM349  
,ID,user Name
,301,NOS
,100,NOT
,500,COS
#/usr/bin/env perl
严格使用;
使用警告;
我的%room_by;
我的$roomname;
而(){
咀嚼;
如果(m/房间名称:\s*(.+)/){
$roomname=$1;
$room_by{$roomname}=();
}
否则{
按{$roomname},$\;
}
}
对于$roomname(按%room\u排序键){
打印“房间名称:$roomname\n”;
对于我的$content(@{$room_by{$roomname}){
打印“$content\n”;
}
}
__资料__
房间名称:RM145
,ID,用户名
,300个
,100,不是
房间名称:370令吉
,ID,用户名
,300个
房间名称:471令吉
,ID,用户名
,300,位置
,100,不是
房间名称:349令吉
,ID,用户名
,301,第
,100,不是
,500,COS
这将在数组的散列中收集房间名称,其中散列键是房间名称,散列值是房间的内容。您还可以对散列值进行排序,以便对其进行排序。

使用GNU awk 4:

此版本应适用于较旧的GNU awk版本:

WHINY_USERS=  awk 'END {
  for (R in r)
    print r[R]
  }
/Room Name:/ {
  rn = sprintf("%15s", substr($NF, 3))
  }
{
  r[rn] = r[rn] ? r[rn] ORS $0 : $0
  }' infile  
使用GNU awk 4:

此版本应适用于较旧的GNU awk版本:

WHINY_USERS=  awk 'END {
  for (R in r)
    print r[R]
  }
/Room Name:/ {
  rn = sprintf("%15s", substr($NF, 3))
  }
{
  r[rn] = r[rn] ? r[rn] ORS $0 : $0
  }' infile  

哇!它工作得很好。我真羡慕你的知识。你是如何快速想出这个解决方案的。非常感谢你!!!哇!它工作得很好。我真羡慕你的知识。你是如何快速想出这个解决方案的。非常感谢你!!!嗨,Dimitre,如果第一个房间名称不是最低值,这将无法按预期工作。嗨@Chris,你说得对,谢谢!如果输入需要按照房间名称的尾随数字进行排序(如果我正确理解您的评论),那么它根本不起作用。我已经更正了脚本。感谢您的回复,很遗憾我有awk版本3,我没有管理员权限更新软件。没有在我的当前版本上工作,非常感谢!!您好@eli1128,我添加了一个经过修改的版本,该版本应该可以与较旧的GNU awk版本一起使用(它不能与GNU awk 4一起使用!)。让我知道它是否有效。迪米特里,你就是那个人!老实说,我是在削弱awk的能力。你证明我错了!!它工作得很好。谢谢!!!我真的很感激你的帮助!!嗨,Dimitre,如果第一个房间名称不是最低值,这将无法按预期工作。嗨@Chris,你说得对,谢谢!如果输入需要按照房间名称的尾随数字进行排序(如果我正确理解您的评论),那么它根本不起作用。我已经更正了脚本。感谢您的回复,很遗憾我有awk版本3,我没有管理员权限更新软件。没有在我的当前版本上工作,非常感谢!!您好@eli1128,我添加了一个经过修改的版本,该版本应该可以与较旧的GNU awk版本一起使用(它不能与GNU awk 4一起使用!)。让我知道它是否有效。迪米特里,你就是那个人!老实说,我是在削弱awk的能力。你证明我错了!!它工作得很好。谢谢!!!我真的很感激你的帮助!!