2011-12-26 7 views
0

キーワードに基づいてソートするにはどうすればよいですか?私は一種の複雑なリストを持っていて、それを並べ替えることができるのだろうかと思っています。次に例を示します。キーワードに基づいてソートするには?

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の両方でファイルを持っています。どちらがソートしやすいのかわかりません。誰にでも提案はありますか?あなたは、各レコードが独自の行にあるように、あなたのファイルをフォーマットすることができますと仮定

答えて

2

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

こんにちはDimitre、最初の部屋名が最低値でない場合、これは期待どおりに機能しません。 – Chris

+0

こんにちは@Chris、ありがとう、ありがとう!入力がルーム名の末尾桁で数値順にソートされる必要がある場合は、まったく機能しません(私のコメントが正しく理解されていれば)。スクリプトを修正しました。 –

+0

お返事ありがとうございます。残念ながら私はバージョン3のawkを持っていますが、ソフトウェアをアップデートする管理者権限はありません。とにかく私の現在のバージョンではうまくいきませんでした! – eli1128

1

が、これはソート・キーは、あなたが行うことができます部屋名であると仮定すると、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 
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 

これは、ハッシュキーがルーム名であり、ハッシュ値がルームの内容である配列のハッシュでルーム名を収集します。ハッシュ値を並べ替えることもできます。 GNUのawkの4

+0

すごい:

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 

この1つは、古いGNUで動作するはずですがバージョンをawkは!それは完璧に働いています。私はあなたの知識に本当に嫉妬しています。どのようにすぐにこのソリューションを考え出すか。本当にありがとう! – eli1128

関連する問題