如何通过按第二列的第一个元素排序来操作两列制表符分隔的文本文件(仅当第一列元素相同时)?
例子:
输入文件 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-10
vs 中A 1-2
,第一个键是相同的(A
字符串),第二个键也是相同的(都被视为数字1
),因此在词法上sort
比较A 1-10
vsA 1-2
并且后者2
在 之后的排序更大1
。的 GNU 实现sort
有一个-V
选项或V
键标志来执行版本排序,这类似于词法比较,只是字符串中的十进制数字序列以数字方式进行比较,因此sort -k1,1 -k2V
会A 1-10
在后面排序,A 1-2
因为10
数字大于2
。
¹从技术上讲,-k2
是指从第二个字段开始(在第一次从非空白转换为空白之后)并在行尾结束的行的部分,但带有n
标志,这相当于-k2,2n
仅作为前导部分考虑构成一个数字。