[英]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-1
或gawk
; 限制是:
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.