2013-07-02 51 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

相关问题