【问题标题】:How to sort based on keyword?如何根据关键字排序?
【发布时间】:2012-01-28 02:31:47
【问题描述】:

如何根据关键词进行排序?我有一个复杂的列表,想知道是否可以对其进行排序。这是一个例子:

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

我的目标是根据“Room Name”对该列表进行排序。

我有纯文本和 CSV 格式的文件。我不知道哪一个会更容易排序。有人有建议吗?

【问题讨论】:

    标签: perl sorting sed awk


    【解决方案1】:

    使用 GNU awk 4

    awk 'END {
      PROCINFO["sorted_in"] = "@ind_num_asc"
      for (R in r)
        print r[R]
      }
    /Room Name:/ {
      rn = substr($NF, 3)
      }
    {
      r[rn] = r[rn] ? r[rn] ORS $0 : $0
      }' infile   
    

    这个应该适用于较旧的 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,你是对的,谢谢!如果输入需要按房间名称的尾随数字进行数字排序(如果我正确理解您的 cmets),它将根本不起作用。我已经更正了脚本。
    • 感谢您的回复,不幸的是我有 awk 版本 3,我没有更新软件的管理员权限。无论如何,在我当前的版本上不起作用非常感谢!
    • 嗨@eli1128,我添加了一个修改版本,它应该适用于旧的 GNU awk 版本(它不适用于 GNU awk 4!)。让我知道它是否有效。
    • Dimitre,你就是男人!老实说我是在破坏awk的能力。你证明我错了!!它运行良好。多谢!!!非常感谢您的帮助!
    【解决方案2】:

    假设排序键是你可以做的房间名称:

    #!/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
    

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

    【讨论】:

    • 哇!它运行良好。我真的很嫉妒你的知识。你如何快速想出这个解决方案。非常感谢!!!
    【解决方案3】:

    假设你可以格式化你的文件,使得每条记录都在自己的行上,这对于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
    

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多