“sort”示例的最小两列数字输入数据,具有不同的排列

时间:2016-08-07 11:49:16

标签: sorting unix sh

为以下四个选项生成四个唯一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,18dinfo sort页面对 KEYDEF 的处理要好得多。

KEYDEF 比它们最初看起来更有用。 -u--unique开关可以很好地与 KEYDEF 配合使用,实际上允许sort删除不需要的冗余线路,因此可以提供更简洁的替代品对于某些sedawk脚本和类似的管道。

1 个答案:

答案 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行保持在其他行之一(以及哪一行取决于用于比较的字段)。