按第一列然后第二列对文件进行排序

dov*_*vah 14 sort

如何通过按第二列的第一个元素排序来操作两列制表符分隔的文本文件(仅当第一列元素相同时)?

例子:

输入文件 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9
Run Code Online (Sandbox Code Playgroud)

预期输出:文件 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 24

使用sort's-k选项一次按(多)列排序:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10
Run Code Online (Sandbox Code Playgroud)

-k1,1首先按第一列排序,然后-k2n在第一列并列时按第二个¹ 以数字方式排序,因此您可以按所需顺序获得输出:按第二列的第一个元素排序,仅当第一列元素相同时。

当按数字排序时,它只会检查该字段,直到它不再是一个数字,这样就可以只比较它的第一个元素。

当两个键比较相同时,则sort在词法上比较整行作为最后的比较。例如,在A 1-10vs 中A 1-2,第一个键是相同的(A字符串),第二个键也是相同的(都被视为数字1),因此在词法上sort比较A 1-10vsA 1-2并且后者2在 之后的排序更大1。的 GNU 实现sort有一个-V选项或V键标志来执行版本排序,这类似于词法比较,只是字符串中的十进制数字序列以数字方式进行比较,因此sort -k1,1 -k2VA 1-10在后面排序,A 1-2因为10数字大于2


¹从技术上讲,-k2是指从第二个字段开始(在第一次从非空白转换为空白之后)并在行尾结束的行的部分,但带有n标志,这相当于-k2,2n仅作为前导部分考虑构成一个数字。