Como classificar o arquivo .property do java contendo chave = valor por coluna de valor?

2

Como posso classificar esse arquivo de propriedade do projeto java por sua coluna de valor? O valor contém tabulações ou espaços antes ou depois do valor. Aqui está como esse arquivo se parece,

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

Agora quero que este arquivo seja classificado como abaixo. E os espaços ou tabulações, antes ou depois dos valores, também devem ser aparados.

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

Além disso, também quero ver apenas pares de valores-chave com chave duplicada, ou seja, todos os valores-chave devem ser exibidos; exceto key4, key5 e key9 porque são únicos.

    
por Kashyap Kansara 16.07.2016 / 21:10

2 respostas

3

Para ver todas as linhas classificadas por valor:

$ 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

Para ver as linhas ordenadas por valor com valores não repetidos removidos:

$ 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

Como funciona

  • sort -k3,3 propfile

    Isso classifica propfile no terceiro campo.

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

    Isso remove todos os espaços em branco finais e substitui as execuções restantes de espaços em branco por um único espaço em branco.

  • uniq -f2 -D

    Ignorando os dois primeiros campos, -f2 e imprime somente linhas duplicadas, -D .

por 16.07.2016 / 21:38
2

Solução de 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

As duas primeiras substituições normalizam o espaço em branco. Em seguida, as chaves são alteradas por valores (imagine Hash<Value,Array<Key>> ). Depois que o arquivo inteiro é processado, os valores com apenas uma chave são excluídos e o restante é impresso, alterando cada elemento do hash para uma lista de seqüências de caracteres do formulário correto.

    
por 16.07.2016 / 21:32