[英]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.