【问题标题】:When and why do i need a 's' flag for sorting by a column什么时候以及为什么我需要一个's'标志来按列排序
【发布时间】:2016-05-18 08:34:19
【问题描述】:

我试图按第一列对文件进行排序,如果第一列具有相同的值,则不更改第二列的顺序,

$ cat test
1   4
1   3
1   2   
1   1
3   3
2   1
2   2
2   3

希望输出:

1   4
1   3
1   2   
1   1
2   1
2   2
2   3
3   3

仅当我使用 sort test -s -k1,1 时才有效。

以下所有更改第二列的顺序:

sort test
sort test -k1
sort test -k1,1
sort test -s -k1

1   1
1   2   
1   3
1   4
2   1
2   2
2   3
3   3

为什么我需要将-s-k1,1 一起使用?

【问题讨论】:

    标签: bash sorting multiple-columns


    【解决方案1】:

    来自man sort

    -s,--稳定 通过禁用最后的比较来稳定排序

    换句话说,如果sort 发现两行有相同的键,它会比较整行来排序。您禁用了与 -s 的最后一个比较,因此您保留了原始顺序。

    https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

    【讨论】:

    • 那么-k1,1和-k1有什么区别?
    • @once -k 允许您定义键的位置 sort 将从行中使用为-k start,end-k1,1 说“仅使用第一个字段作为键排序”,-k1 说“使用从第一个字段到行尾的子行作为键排序”,因为默认停止位置是行尾.这就是为什么在您的示例中您需要-k1,1 而不是-k1。我建议你阅读sort的手册:man7.org/linux/man-pages/man1/sort.1.html
    • 我阅读了这两个标志的手册,只是无法弄清楚为什么在使用 -k1,1 "sort using as key only the first field" 时事情不起作用,但仍然需要添加 -s stable标记这种情况
    • @once 无论您选择什么键,sort 的默认行为是如果两个键相同,它将使用最后的比较来决定如何排序,可能是因为它很有用大多数情况下。但是忘记那个特定的行为,排序算法不需要保留原始顺序,你需要选择一个适合你的情况。要使用sort 执行此操作,您需要-s--stable 选项。
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 2011-09-20
    • 2011-04-15
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多