我有一个文本文件,其中有 3 列,中间用 : 如何按第 2 列的最后 2 位数字对第二列进行排序?

我有一个文本文件,其中有 3 列,中间用 : 如何按第 2 列的最后 2 位数字对第二列进行排序?

这是文本文件的示例:

195.92.211.47:21029:400
195.92.211.48:21023:400

如何按第二列的最后 2 位数字对文件的行进行排序?第二列始终为五位数字。

答案1

假设第二个:- 分隔字段始终包含五位数字:

$ sort -t ':' -k2.4,2n file
195.92.211.48:21023:400
195.92.211.47:21029:400

指示使用第二个字段,从字符 4 开始(就是这样做的)到字段末尾作为排序键,并按该键(末尾的)-k2.4,2n对输入进行数字排序。要按数字排序sort.4n所有的第二个字段,您会使用-k2,2n.我们过去常-t ':'说字段是用冒号分隔的。

如果您运行命令(此处--debug同时显示 GNUsort和OpenBSD),您可以看到它使用正确的数字进行排序:sort

$ gsort --debug -t ':' -k2.4,2n file
gsort: text ordering performed using simple byte comparison
195.92.211.48:21023:400
                 __
_______________________
195.92.211.47:21029:400
                 __
_______________________
$ sort --debug -t ':' -k2.4,2n file
Memory to be used for sorting: 2139060224
sort_method=heapsort
; k1=<23>, k2=<29>; s1=<195.92.211.48:21023:400>, s2=<195.92.211.47:21029:400>; cmp1=-1
195.92.211.48:21023:400
195.92.211.47:21029:400

答案2

使用sort -t: -nk2.4

-t uses the delimiter :
-n for numerical sort
-k your key is the second column

关键定义在 中得到了很好的解释info sort

'-k POS1[,POS2]'

'--key=POS1[,POS2]'

指定由 POS1 和 POS2 之间的行部分(或行尾,如果省略 POS2)组成的排序字段, 包括的

每个 POS 的格式为“F[.C][OPTS]”,其中 F 是要使用的字段编号,C 是从字段开头算起的第一个字符的编号。字段和字符位置从 1 开始编号; POS2 中的字符位置为零表示该字段的最后一个字符。如果 POS1 中省略“.C”,则默认为 1(字段的开头);如果从 POS2 中省略,则默认为 0(字段末尾)。 OPTS 是排序选项,允许根据不同的规则对各个键进行排序;详情请参见下文。键可以跨越多个字段。

示例:要对第二个字段进行排序,请使用“--key=2,2”(“-k 2,2”)。有关按键的更多注释和更多示例,请参阅下文。另请参阅“--debug”选项来帮助确定排序中使用的行部分。

相关内容