2

多数のキーと値のペアを含むテキスト ファイルがあります。キーと値のペアは各行で同じ順序ではなく、私のシーケンス キーのみが各行にあることが保証されています。

キー値に基づいてLinuxでファイルをソートするにはどうすればよいですか? 例えば

key1=blah key2=something key4=else sequence=3
sequence=1 key2=xlde key7=eldl
blahkey=xxx sequence=2 keyx=adada

「シーケンス」キーに基づいてファイルをソートする必要があります。いえ

sequence=1 key2=xlde key7=eldl
blahkey=xxx sequence=2 keyx=adada
key1=blah key2=something key4=else sequence=3

ありがとう

4

2 に答える 2

1

シーケンスキーが各行にあるだけでなく、一意であり、その値が行数を超えないように保証されている場合 (例のように)、次のことができます。

  1. 行サイズの配列を割り当てます。

  2. すべての行について:

    2.1 "sequence=" とスペースでテキストをスライスして、テキスト内のシーケンス番号を取得します。

    2.2 テキスト内の数字をインデックスに変換します。

    2.3 新しい配列の対応するセルに行を挿入します。

Python では、次のようになります。

lines = [
"key1=blah key2=something key4=else sequence=3",
"sequence=1 key2=xlde key7=eldl",
"blahkey=xxx sequence=2 keyx=adada"
]

new_lines = [""] * len(lines)

for line in lines:
    after_sequence = line.split("sequence=")[1]
    and_before_space = after_sequence.split(" ")[0]
    n = int(and_before_space) - 1
    new_lines[n] = line

print new_lines
于 2013-07-02T07:57:46.180 に答える
0

これを perl で行う場合は、ファイル全体を丸呑みしてマンジし、シーケンス番号に基づいて元の生の行をソートできるようにします。あなたのファイル形式がどの程度一貫しているかはわかりませんが、1 つの perl アプローチは次のようになります。

#!/usr/bin/perl -w

my @data;

# slurp in each line, and tag it by its sequence number
foreach my $line ( <STDIN> )
{
    if ($line =~ /sequence=(\S+)/)
    {
        push @data, { sequence => $1, line => $line };
    } else
    {
        die "unhandled line: $line";  # only if needed
    }
}

# sort the lines by their sequence number into @sorted
my @sorted = sort { $a->{sequence} <=> $b->{sequence} } @data;

# generate the final result by extracting the original lines
# from the sorted array and concatenating them
my $result = join("", map { $_->{line} } @sorted);

# output the sorted result
print $result;

上記の例でこれを試してみましたが、うまくいきました。dieスクリプトが安全に無視できる「ガベージ」行が入力に含まれている可能性がある場合は、その行をマッサージすることができます。

また、昇順と降順を切り替える必要がある場合は、次の行で and を入れ替えることができ$aます$b

my @sorted = sort { $a->{sequence} <=> $b->{sequence} } @data;

シーケンス番号が純粋な数値ではない場合、またはそれらを文字列として比較する場合は、<=>演算子をcmp次のように変更します。

my @sorted = sort { $a->{sequence} cmp $b->{sequence} } @data;
于 2013-07-02T07:12:39.767 に答える