2 votes

Comment trier un fichier .property de java contenant <key> = <value> par la colonne <value> ?

Comment puis-je trier ce fichier de propriétés du projet java par sa colonne de valeurs ? La valeur contient des tabulations ou des espaces avant ou après la valeur. Voici à quoi ressemble ce fichier,

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

Maintenant je veux que ce fichier soit trié comme ci-dessous. Et les espaces ou les tabulations, avant ou après les valeurs doivent également être coupés.

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

En plus de cela, je veux également voir uniquement les paires clé-valeur ayant une clé dupliquée, c'est-à-dire que toutes les valeurs clés doivent être affichées, sauf key4, key5 et key9 car elles sont uniques.

3voto

John1024 Points 15663

Pour voir toutes les lignes triées par valeur :

$ 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

Pour voir les lignes triées par valeur, les valeurs non répétées étant supprimées :

$ 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

Comment cela fonctionne

  • sort -k3,3 propfile

    Cela permet de trier propfile sur le troisième champ.

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

    Cette opération supprime tous les espaces blancs de fin de ligne, puis remplace tous les espaces blancs restants par un simple blanc.

  • uniq -f2 -D

    Ignorant les deux premiers champs, -f2 et n'imprime que les lignes dupliquées, -D .

2voto

choroba Points 17339

Solution 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

Les deux premières substitutions normalisent les espaces blancs. Ensuite, les clés sont hachées par les valeurs (imaginez Hash<Value,Array<Key>> ). Une fois que le fichier entier est traité, les valeurs avec une seule clé sont supprimées, et le reste est imprimé, changeant chaque élément du hachage en une liste de chaînes de caractères de la forme correcte.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X