簡體   English   中英

使用分隔符“。”對多列進行排序在 bash

[英]Sorting multiple columns with delimiter "." in bash

我正在嘗試對如下所示的文本列表進行排序:

2023.12.14
2020.10.4
2020.10.1
2020.5.18
2023.14.1
2021.1.1

所需的輸出:

2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

我嘗試使用以下命令來實現它:

sort -t "." -k1,1 -k2,1 -k3,1 sortingTest.txt

使用此命令,我嘗試按第一個“列”(分隔符“。”之前的任何內容)對其進行排序,如果兩個值相等,則比較第二列的值等。

由於某種原因,它僅通過比較第一列的值進行排序。

我錯過了什么?

認為sort -V可以根據需要對數據進行排序:

$ echo '2023.12.14
> 2020.10.4
> 2020.10.1
> 2020.5.18
> 2023.14.1
> 2021.1.1' | sort -V

2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

您遇到了一些問題, -k定義為: -kfield1[,field2] ,這意味着-k2,1無效。 您可以使用-k1 -k2 -k3對前三個字段進行排序。

您正確地希望對字段進行數字排序,可以使用-n see man 1 sort啟用其他數字排序選項:

$ sort -t. -n -k1 -k2 -k3 file.txt
2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

可能對你有用。

如果這些實際上是版本而不是日期,那么-V可能就足夠了。

AFAIK 唯一可以通過sort來完成的方法是使用-V 但是-V不是 POSIX,並且在某些類型的實現中不可用。 所以這是一個 POSIX(便攜式)解決方案:

awk -F . '{printf "%04d.%02d.%02d\n", $1,$2,$3}' dates-file |
sort |
awk -F . '{printf "%d.%d.%d\n", $1,$2,$3}'

awk 將字段轉換為固定長度以進行排序,然后再次將排序的數據轉換為原始格式。 這假設這些是日期。

沒有我希望的那么好的解決方案 - 這個解決方案特定於mawk-1gawk 限制是:

  • 中場和最右邊場的硬上限為8^5-1
  • 最左邊的字段最多允許8^6-1

該方法是創建一個統一的排序鍵,以數字和ASCII字節順序對相同的排序鍵進行排序,同時為 3 個字段中的每一個字段留出足夠的增長空間。

純副本以LIFO為基礎打印出來

2 個前綴ascii control bytes用於防止進程流中的任何地方,無論是在awk之內還是之外,當它看到可能80-bit大小的十六進制時,嘗試以浮點精度不足的純數字。

WHINY_USERS=1 {m,g}awk '        # this is a shell param for mawk-1
BEGIN {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        FS = "["(_=+(\
       OFS = "." ) )"]" 
} { __[\
    ____($_)]=$_ } END { for(_ in __) {
                            print __[_] } } 
function ____(___,__,_) {
    return  \
    sprintf("\31\17%.*s%.8X%.4X%.8X",(__="")*split(__,_),
    split(___,_,"[.]"), int((__=_[++__]*(___=(++__^++__\
           )^(__--+__))*___ + _[__]*___ + _[++__]) \
           )/(___+=___),__%___,___*___-___^(!___)-NR) 
}'

|

2020.5.18
2020.10.1
2020.10.4
2021.1.1
2023.12.14
2023.14.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM