2

Как я могу отсортировать этот файл свойств из проекта 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, потому что они уникальны.

2 ответа2

3

Чтобы увидеть все строки, отсортированные по значению:

$ 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>>). Как только весь файл обработан, значения только с одним ключом удаляются, а остальные печатаются, изменяя каждый элемент хэша на список строк правильной формы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .