2013-07-02 50 views
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 

感謝

回答

1

如果序列密鑰保證下,不僅要在每行,但是是唯一的,它的價值不超過數行(如例如),您可以執行以下操作:

  1. 分配一行數組的大小。

  2. 對於每一行:

    2.1通過用切片它在檢索文本序列號「序列=」和一個空格。

    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 
0

如果我在Perl這樣做,我會在思樂普整個文件和Munge時間就這樣我就可以根據自己的序列號的原生線排序。我不知道你的文件格式是多麼一致,但一個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行。

此外,如果需要升序和降序排列順序之間切換,你可以在這行交換$a$b

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

如果序列號不純粹是數字,或要比較他們作爲字符串,改變<=>運營商cmp

my @sorted = sort { $a->{sequence} cmp $b->{sequence} } @data; 
+0

感謝,去除分模線,但做的把戲我。乾杯! – brercia

相關問題