Как отсортировать файл Java.property, содержащий столбец <key> = <value> по <value>?
Как я могу отсортировать этот файл свойств из проекта 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 ответа
Чтобы увидеть все строки, отсортированные по значению:
$ 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
,
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>>
). Как только весь файл обработан, значения только с одним ключом удаляются, а остальные печатаются, изменяя каждый элемент хеш-функции на список строк правильной формы.