2011-10-30 4 views
2

の最後のフィールドに区切り文字を使用した後どのようにソート例えばbashのスクリプト

は、コマンドからの我々は結果を得る「前」と呼んでみましょう、この結果はテキスト

の行が含まれていると仮定することができますこのテキストを印刷する前に、区切り文字を使ってソートするためにsortコマンドを使いたいと思っています。この場合

は、区切り文字は「*」

事は、私はいつものラインが私は私の並べ替えをしたいという

text*text***text*********text..*numberstext 

のようなものであるならば、たとえば最後のフィールドでソートしたい、ですすべての行は、私はちょうど掲示ラインの通りであった場合、ソートnumberstext

に、この場合には、最後のフィールドを使用すると、それは私だけで共同することができます

簡単だろうすべての行が同じ形をしている、その後UNT区切り文字を使用したときに作成されているフィールド(我々はN個のフィールドがあるとします)と、このコマンド

previous command | sort -t * -k N -n 

ではなくを適用するには、いくつかのラインはそのようなことができます:

あなたが見ることができるように区切り文字として文字*を使用した場合
text:::***:*numberstext 

は、私はいつも最後のフィールドを見つけるために、私は方法を探している最後のフィールド基本的に

を使用してソートしたい

私はそれが

previous command | sort -t * -k $some_variable_denoting_the_ammount_of_fields -n 

ようなものかもしれないと考えていたが、私はそのようなものがあるかどうかわからない。..

感謝を:)

+0

データを「正規化」する前にフィルターを追加して、各レコードが同じ数のフィールドを持つようにしなければなりません。がんばろう。 – shellter

+0

しかし、これは可能ではありません。私は出力が入力のようになりたいがソートします。もしあなたが提案したようにすれば、出力は入力と異なるでしょうか? – jonathan

+0

はい、出力はdiffです。もう1つの選択肢は、好みのプログラミング言語でカスタムソートを書くことです。行きましょう。がんばろう。 – shellter

答えて

2

使用することはで最後のフィールドを複製するためのsed行の開始、並べ替え、次にsedを使用して複製を削除します。おそらくあなたの好きなプログラミング言語を使うのはもっと簡単だろう。ここで

0

はそれのためのperlスクリプトです:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $regex = qr/\*([^*]*)$/o; 

sub bylast 
{ 
    my $ak = ($a =~ $regex, $1) || ""; 
    my $bk = ($b =~ $regex, $1) || ""; 
    $ak cmp $bk; 
} 

print for sort bylast (<>); 
0

これはうまくいくかもしれない:

sed -r 's/.*\*([^*]+$)/\[email protected]@@&/' source | sort | sed 's/^.*@@@//' 

はソートキーN.B.を削除し、それを並べ替え、前に最後のフィールドを追加します。 @@@は、ソースファイルに存在しない限り、好きなものにすることができます。 クレジットは@Havenlessに行くべきです。これはちょうどコードに入れられた彼のアイデアです

関連する問題