我有一個文字文件,其中有 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”選項來協助確定排序中使用的行部分。

相關內容