为以下四个选项生成四个唯一sort
输出所需的两列数字输入的最小行数是多少:
1. -sn -k1
2. -sn -k2
3. -sn -k1 -k2
4. -sn -k2 -k1
?
这是一个6行示例(带有4个唯一输出):
6 5
3 7
6 3
2 7
4 4
5 2
为方便起见,给出了两列数字计算这四个输出的函数(需要moreutils pee
命令),它打印了唯一输出的数量:
# Usage: foo c1_1 c2_1 c1_2 c2_2 ...
foo() { echo "$@" | tr -s '[:space:]' '\n' | paste - - | \
pee "sort -sn -k1 | md5sum" \
"sort -sn -k2 | md5sum" \
"sort -sn -k1 -k2 | md5sum" \
"sort -sn -k2 -k1 | md5sum" | \
sort -u | wc -l ; }
所以要计算这个输入的唯一排列:
8 5
3 5
8 4
运行:
foo 8 5 3 1 8 3
输出:
2
(只有两个独特的输出。还不够......)
注意:这个问题的灵感来自当前版本sort
手册的模糊性,特别是COLUMNS=65 man sort | grep -A 17 KEYDEF | sed 3,18d
。 info sort
页面对 KEYDEF 的处理要好得多。
KEYDEF 比它们最初看起来更有用。 -u
或--unique
开关可以很好地与 KEYDEF 配合使用,实际上允许sort
删除不需要的冗余线路,因此可以提供更简洁的替代品对于某些sed
或awk
脚本和类似的管道。
答案 0 :(得分:1)
我可以通过改变空格来实现它:
1 1
2 1
1 2
你的foo
函数不会产生这种输出,但由于它只是一个“方便”而不是问题的一部分,我宣布这个答案是正确的和最小的!
Sneakier版本:
2 1
11 1
2 2
(最后一行包含一个标签;其他行则没有。)
使用-s
选项,我无法利用非数字比较,但我可以利用排序的稳定性:
1 2
2 1
1 1
如果两个字段都是数字比较,1 1
行超过其他两个字段,无论先进行哪个比较。两个比较的排序决定了其他两行的顺序。
另一方面,如果其中一个字段未用于比较,则1 1
行保持在其他行之一(以及哪一行取决于用于比较的字段)。