如何对包含以下内容的 java .property 文件进行排序=经过柱子?

如何对包含以下内容的 java .property 文件进行排序=经过柱子?

如何按值列对 Java 项目中的此属性文件进行排序?值在值之前或之后包含制表符或空格。此文件如下所示,

key1    = value1
key2 =         value2       
key3 =  value1   
key4   =        value3       
key5 =          value4  
key6 = value5               
key7   =        value2          
key8     =                value5          
key9  =    value6     
key10   = value5

现在我希望此文件按如下所示排序。并且值之前或之后的空格或制表符也应被修剪。

key1 = value1
key3 = value1
key2 = value2
key7 = value2
key4 = value3
key5 = value4
key6 = value5
key8 = value5
key10 = value5
key9 =  value6

除此之外,我还想只看到具有重复键的键值对,即应该显示所有键值;除了 key4、key5 和 key9,因为它们是唯一的。

答案1

要查看按值排序的所有行:

$ sort -k3,3 propfile | sed -E 's/[[:space:]]*$//; s/[[:space:]]+/ /g'
key1 = value1
key3 = value1
key7 = value2
key2 = value2
key4 = value3
key5 = value4
key10 = value5
key6 = value5
key8 = value5
key9 = value6

要查看按值排序并删除非重复值的行:

$ sort -k3,3 propfile | sed -E 's/[[:space:]]*$//; s/[[:space:]]+/ /g' | uniq -f2 -D
key1 = value1
key3 = value1
key7 = value2
key2 = value2
key10 = value5
key6 = value5
key8 = value5

怎么运行的

  • sort -k3,3 propfile

    propfile按第三个字段进行排序。

  • sed -E 's/[[:space:]]*$//; s/[[:space:]]+/ /g'

    这将删除所有尾随空格,然后用单个空格替换所有剩余的空格。

  • uniq -f2 -D

    忽略前两个字段,,-f2并且仅打印重复的行,-D

答案2

Perl 解决方案:

perl -ne '
    s/\s+/ /g;
    s/\s+$//;
    ($v, $k) = split / = /, $_, 2;
    push @{ $h{$k} }, $v;
    }{
    1 == @{ $h{$_} } and delete $h{$_} for keys %h;
    print map {
        $k = $_;
        map "$_ = $k\n", @{ $h{$k} }
    } sort keys %h' < input-file

前两个替换将空格标准化。然后,将键按值进行哈希处理(想象一下Hash<Value,Array<Key>>)。处理完整个文件后,将删除只有一个键的值,并打印其余值,将哈希的每个元素更改为正确形式的字符串列表。

相关内容