如何按值列对 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>>
)。处理完整个文件后,将删除只有一个键的值,并打印其余值,将哈希的每个元素更改为正确形式的字符串列表。