Как сортировать по ключевым словам? - PullRequest
0 голосов
/ 26 декабря 2011

Как я могу сортировать по ключевым словам?У меня довольно сложный список, и мне интересно, смогу ли я его отсортировать.Вот пример:

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.Я не знаю, какой из них будет легче сортировать.У кого-нибудь есть предложения?

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

Предполагая, что ключ сортировки - это имя комнаты, которое вы можете сделать:

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

Это собирает имена комнат в хэш-массив, где ключ хеша - это имя комнаты, а значения хеш-функции - содержимоекомнаты.Вы также можете отсортировать значения хешей, чтобы упорядочить их тоже.

2 голосов
/ 26 декабря 2011

С 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  
1 голос
/ 26 декабря 2011

Если вы можете отформатировать файл так, чтобы каждая запись находилась в отдельной строке, это довольно тривиально с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...